hopefully fix race condition in acks

This commit is contained in:
Erik 2016-07-14 18:57:27 -04:00
parent 22030e1153
commit 9cc60ab63d
2 changed files with 13 additions and 9 deletions

View File

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

View File

@ -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.