From 8345eae28cdae8774fbe8e55fc337133308a8af4 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 14 Jul 2016 19:25:48 -0400 Subject: [PATCH] don't stall queues --- Source/SocketAckManager.swift | 12 ++++++++---- Source/SocketIOClient.swift | 10 ++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Source/SocketAckManager.swift b/Source/SocketAckManager.swift index e229c93..682b4f8 100644 --- a/Source/SocketAckManager.swift +++ b/Source/SocketAckManager.swift @@ -57,16 +57,20 @@ struct SocketAckManager { } /// Should be called on handle queue - mutating func executeAck(ack: Int, items: [AnyObject]) { + mutating func executeAck(ack: Int, items: [AnyObject], onQueue: dispatch_queue_t) { let callback = acks.remove(SocketAck(ack: ack)) - callback?.callback(items) + dispatch_async(onQueue) { + callback?.callback(items) + } } /// Should be called on handle queue - mutating func timeoutAck(ack: Int) { + mutating func timeoutAck(ack: Int, onQueue: dispatch_queue_t) { let callback = acks.remove(SocketAck(ack: ack)) - callback?.callback(["NO ACK"]) + dispatch_async(onQueue) { + callback?.callback(["NO ACK"]) + } } } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index a176059..ac5a159 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 = dispatch_queue_create("com.socketio.ackQueue", DISPATCH_QUEUE_SERIAL) private let emitQueue = dispatch_queue_create("com.socketio.emitQueue", DISPATCH_QUEUE_SERIAL) private let logType = "SocketIOClient" private let parseQueue = dispatch_queue_create("com.socketio.parseQueue", DISPATCH_QUEUE_SERIAL) @@ -163,17 +164,18 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable return {[weak self, ack = currentAck] timeout, callback in if let this = self { - dispatch_sync(this.handleQueue) { + dispatch_sync(this.ackQueue) { this.ackHandlers.addAck(ack, callback: callback) } + this._emit(items, ack: ack) if timeout != 0 { let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) - dispatch_after(time, this.handleQueue) { - this.ackHandlers.timeoutAck(ack) + dispatch_after(time, this.ackQueue) { + this.ackHandlers.timeoutAck(ack, onQueue: this.handleQueue) } } } @@ -299,7 +301,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") dispatch_async(handleQueue) { - self.ackHandlers.executeAck(ack, items: data) + self.ackHandlers.executeAck(ack, items: data, onQueue: self.handleQueue) } }