don't stall queues
This commit is contained in:
parent
9cc60ab63d
commit
8345eae28c
@ -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"])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user