Execute acks sync. Implement #950

This commit is contained in:
Erik Little 2018-02-11 17:16:15 -05:00
parent 1e29b2047d
commit 9b10cab925
No known key found for this signature in database
GPG Key ID: B8E1F067FE8DCAAF
5 changed files with 11 additions and 22 deletions

View File

@ -1 +1 @@
4.0.2 system

View File

@ -121,9 +121,9 @@ public final class OnAckCallback : NSObject {
guard seconds != 0 else { return } guard seconds != 0 else { return }
socket.manager?.handleQueue.asyncAfter(deadline: DispatchTime.now() + seconds) {[weak socket] in socket.manager?.handleQueue.asyncAfter(deadline: DispatchTime.now() + seconds) {[weak socket] in
guard let socket = socket, let manager = socket.manager else { return } guard let socket = socket else { return }
socket.ackHandlers.timeoutAck(self.ackNumber, onQueue: manager.handleQueue) socket.ackHandlers.timeoutAck(self.ackNumber)
} }
} }

View File

@ -60,29 +60,18 @@ private struct SocketAck : Hashable {
struct SocketAckManager { struct SocketAckManager {
private var acks = Set<SocketAck>(minimumCapacity: 1) private var acks = Set<SocketAck>(minimumCapacity: 1)
private let ackSemaphore = DispatchSemaphore(value: 1)
mutating func addAck(_ ack: Int, callback: @escaping AckCallback) { mutating func addAck(_ ack: Int, callback: @escaping AckCallback) {
acks.insert(SocketAck(ack: ack, callback: callback)) acks.insert(SocketAck(ack: ack, callback: callback))
} }
/// Should be called on handle queue /// Should be called on handle queue
mutating func executeAck(_ ack: Int, with items: [Any], onQueue: DispatchQueue) { mutating func executeAck(_ ack: Int, with items: [Any]) {
ackSemaphore.wait() acks.remove(SocketAck(ack: ack))?.callback(items)
defer { ackSemaphore.signal() }
let ack = acks.remove(SocketAck(ack: ack))
onQueue.async() { ack?.callback(items) }
} }
/// Should be called on handle queue /// Should be called on handle queue
mutating func timeoutAck(_ ack: Int, onQueue: DispatchQueue) { mutating func timeoutAck(_ ack: Int) {
ackSemaphore.wait() acks.remove(SocketAck(ack: ack))?.callback?([SocketAckStatus.noAck.rawValue])
defer { ackSemaphore.signal() }
let ack = acks.remove(SocketAck(ack: ack))
onQueue.async() {
ack?.callback?([SocketAckStatus.noAck.rawValue])
}
} }
} }

View File

@ -314,11 +314,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec {
/// - parameter data: The data sent back with this ack. /// - parameter data: The data sent back with this ack.
@objc @objc
open func handleAck(_ ack: Int, data: [Any]) { open func handleAck(_ ack: Int, data: [Any]) {
guard status == .connected, let manager = self.manager else { return } guard status == .connected else { return }
DefaultSocketLogger.Logger.log("Handling ack: \(ack) with data: \(data)", type: logType) DefaultSocketLogger.Logger.log("Handling ack: \(ack) with data: \(data)", type: logType)
ackHandlers.executeAck(ack, with: data, onQueue: manager.handleQueue) ackHandlers.executeAck(ack, with: data)
} }
/// Called on socket.io specific events. /// Called on socket.io specific events.

View File

@ -21,7 +21,7 @@ class SocketAckManagerTest : XCTestCase {
} }
ackManager.addAck(1, callback: callback) ackManager.addAck(1, callback: callback)
ackManager.executeAck(1, with: itemsArray, onQueue: DispatchQueue.main) ackManager.executeAck(1, with: itemsArray)
waitForExpectations(timeout: 3.0, handler: nil) waitForExpectations(timeout: 3.0, handler: nil)
} }
@ -44,7 +44,7 @@ class SocketAckManagerTest : XCTestCase {
} }
ackManager.addAck(1, callback: callback) ackManager.addAck(1, callback: callback)
ackManager.timeoutAck(1, onQueue: DispatchQueue.main) ackManager.timeoutAck(1)
waitForExpectations(timeout: 0.2, handler: nil) waitForExpectations(timeout: 0.2, handler: nil)
} }