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
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"])
}
}
}

View File

@ -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)
}
}