diff --git a/Source/SocketAckManager.swift b/Source/SocketAckManager.swift index 8143243..e229c93 100644 --- a/Source/SocketAckManager.swift +++ b/Source/SocketAckManager.swift @@ -56,19 +56,17 @@ struct SocketAckManager { acks.insert(SocketAck(ack: ack, callback: callback)) } + /// Should be called on handle queue mutating func executeAck(ack: Int, items: [AnyObject]) { let callback = acks.remove(SocketAck(ack: ack)) - - dispatch_async(dispatch_get_main_queue()) { - callback?.callback(items) - } + + callback?.callback(items) } + /// Should be called on handle queue mutating func timeoutAck(ack: Int) { let callback = acks.remove(SocketAck(ack: ack)) - dispatch_async(dispatch_get_main_queue()) { - callback?.callback(["NO ACK"]) - } + callback?.callback(["NO ACK"]) } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 70c6f22..a176059 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -60,6 +60,7 @@ 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 = dispatch_get_main_queue() private(set) var reconnectAttempts = -1 @@ -162,7 +163,10 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return {[weak self, ack = currentAck] timeout, callback in if let this = self { - this.ackHandlers.addAck(ack, callback: callback) + dispatch_sync(this.handleQueue) { + this.ackHandlers.addAck(ack, callback: callback) + } + this._emit(items, ack: ack) if timeout != 0 { @@ -294,7 +298,9 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") - ackHandlers.executeAck(ack, items: data) + dispatch_async(handleQueue) { + self.ackHandlers.executeAck(ack, items: data) + } } /// Causes an event to be handled. Only use if you know what you're doing.