diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index de88465..fab681a 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -19,7 +19,7 @@ class SocketAckManagerTest: XCTestCase { callbackExpection.fulfill() } ackManager.addAck(1, callback: callback) - ackManager.executeAck(1, items: itemsArray) + ackManager.executeAck(1, with: itemsArray, onQueue: DispatchQueue.main) waitForExpectations(withTimeout: 3.0, handler: nil) } diff --git a/SocketIO-MacTests/SocketObjectiveCTest.m b/SocketIO-MacTests/SocketObjectiveCTest.m index 2270a42..6043a24 100644 --- a/SocketIO-MacTests/SocketObjectiveCTest.m +++ b/SocketIO-MacTests/SocketObjectiveCTest.m @@ -21,8 +21,7 @@ - (void)setUp { [super setUp]; NSURL* url = [[NSURL alloc] initWithString:@"http://localhost"]; - self.socket = [[SocketIOClient alloc] initWithSocketURL:url - options:@{@"handleQueue": dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)}]; + self.socket = [[SocketIOClient alloc] initWithSocketURL:url options:nil]; } - (void)testOnSyntax { diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 2e377c5..7f4bba6 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -16,8 +16,7 @@ class SocketSideEffectTest: XCTestCase { override func setUp() { super.setUp() - socket = SocketIOClient(socketURL: URL(string: "http://localhost/")!, - options: [.handleQueue(DispatchQueue(label: "handleQueue", attributes: .serial, target: nil))]) + socket = SocketIOClient(socketURL: URL(string: "http://localhost/")!) socket.setTestable() } diff --git a/Source/SocketAckManager.swift b/Source/SocketAckManager.swift index cda532f..d2d0dfc 100644 --- a/Source/SocketAckManager.swift +++ b/Source/SocketAckManager.swift @@ -57,16 +57,16 @@ struct SocketAckManager { } /// Should be called on handle queue - mutating func executeAck(_ ack: Int, items: [AnyObject]) { - let callback = acks.remove(SocketAck(ack: ack)) + mutating func executeAck(_ ack: Int, with items: [AnyObject], onQueue: DispatchQueue) { + let ack = acks.remove(SocketAck(ack: ack)) - callback?.callback(items) + onQueue.async() { ack?.callback(items) } } /// Should be called on handle queue - mutating func timeoutAck(_ ack: Int) { - let callback = acks.remove(SocketAck(ack: ack)) + mutating func timeoutAck(_ ack: Int, onQueue: DispatchQueue) { + let ack = acks.remove(SocketAck(ack: ack)) - callback?.callback(["NO ACK"]) + onQueue.async() { ack?.callback(["NO ACK"]) } } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 4beda6b..15ce86e 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -49,6 +49,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return nsp + "#" + (engine?.sid ?? "") } + private let ackQueue = DispatchQueue(label: "com.socketio.ackQueue", attributes: .serial) private let emitQueue = DispatchQueue(label: "com.socketio.emitQueue", attributes: .serial) private let logType = "SocketIOClient" private let parseQueue = DispatchQueue(label: "com.socketio.parseQueue", attributes: .serial) @@ -60,7 +61,6 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable private var reconnecting = false private(set) var currentAck = -1 - // Handle queue also controls access to ackManager private(set) var handleQueue = DispatchQueue.main private(set) var reconnectAttempts = -1 @@ -160,20 +160,21 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable private func createOnAck(_ items: [AnyObject]) -> OnAckCallback { currentAck += 1 - + return {[weak self, ack = currentAck] timeout, callback in if let this = self { - this.handleQueue.sync() { + this.ackQueue.sync() { this.ackHandlers.addAck(ack, callback: callback) } + this._emit(items, ack: ack) - + if timeout != 0 { let time = DispatchTime.now() + Double(Int64(timeout * NSEC_PER_SEC)) / Double(NSEC_PER_SEC) - + this.handleQueue.after(when: time) { - this.ackHandlers.timeoutAck(ack) + this.ackHandlers.timeoutAck(ack, onQueue: this.handleQueue) } } } @@ -299,7 +300,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data) handleQueue.async() { - self.ackHandlers.executeAck(ack, items: data) + self.ackHandlers.executeAck(ack, with: data, onQueue: self.handleQueue) } }