don't stall queues

This commit is contained in:
Erik 2016-07-14 19:25:48 -04:00
parent 9cc60ab63d
commit 8345eae28c
2 changed files with 14 additions and 8 deletions

View File

@ -57,16 +57,20 @@ struct SocketAckManager {
} }
/// Should be called on handle queue /// 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)) let callback = acks.remove(SocketAck(ack: ack))
callback?.callback(items) dispatch_async(onQueue) {
callback?.callback(items)
}
} }
/// Should be called on handle queue /// 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)) let callback = acks.remove(SocketAck(ack: ack))
callback?.callback(["NO ACK"]) dispatch_async(onQueue) {
callback?.callback(["NO ACK"])
}
} }
} }

View File

@ -49,6 +49,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
return nsp + "#" + (engine?.sid ?? "") 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 emitQueue = dispatch_queue_create("com.socketio.emitQueue", DISPATCH_QUEUE_SERIAL)
private let logType = "SocketIOClient" private let logType = "SocketIOClient"
private let parseQueue = dispatch_queue_create("com.socketio.parseQueue", DISPATCH_QUEUE_SERIAL) 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 return {[weak self, ack = currentAck] timeout, callback in
if let this = self { if let this = self {
dispatch_sync(this.handleQueue) { dispatch_sync(this.ackQueue) {
this.ackHandlers.addAck(ack, callback: callback) this.ackHandlers.addAck(ack, callback: callback)
} }
this._emit(items, ack: ack) this._emit(items, ack: ack)
if timeout != 0 { if timeout != 0 {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC))
dispatch_after(time, this.handleQueue) { dispatch_after(time, this.ackQueue) {
this.ackHandlers.timeoutAck(ack) 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 ?? "") DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "")
dispatch_async(handleQueue) { dispatch_async(handleQueue) {
self.ackHandlers.executeAck(ack, items: data) self.ackHandlers.executeAck(ack, items: data, onQueue: self.handleQueue)
} }
} }