hopefully fix race condition in acks
This commit is contained in:
parent
22030e1153
commit
9cc60ab63d
@ -56,19 +56,17 @@ struct SocketAckManager {
|
|||||||
acks.insert(SocketAck(ack: ack, callback: callback))
|
acks.insert(SocketAck(ack: ack, callback: callback))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Should be called on handle queue
|
||||||
mutating func executeAck(ack: Int, items: [AnyObject]) {
|
mutating func executeAck(ack: Int, items: [AnyObject]) {
|
||||||
let callback = acks.remove(SocketAck(ack: ack))
|
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) {
|
mutating func timeoutAck(ack: Int) {
|
||||||
let callback = acks.remove(SocketAck(ack: ack))
|
let callback = acks.remove(SocketAck(ack: ack))
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
|
||||||
callback?.callback(["NO ACK"])
|
callback?.callback(["NO ACK"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@ -60,6 +60,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable
|
|||||||
private var reconnecting = false
|
private var reconnecting = false
|
||||||
|
|
||||||
private(set) var currentAck = -1
|
private(set) var currentAck = -1
|
||||||
|
// Handle queue also controls access to ackManager
|
||||||
private(set) var handleQueue = dispatch_get_main_queue()
|
private(set) var handleQueue = dispatch_get_main_queue()
|
||||||
private(set) var reconnectAttempts = -1
|
private(set) var reconnectAttempts = -1
|
||||||
|
|
||||||
@ -162,7 +163,10 @@ 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) {
|
||||||
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 {
|
||||||
@ -294,7 +298,9 @@ 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 ?? "")
|
||||||
|
|
||||||
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.
|
/// Causes an event to be handled. Only use if you know what you're doing.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user