diff --git a/SwiftIO/SocketAckHandler.swift b/SwiftIO/SocketAckHandler.swift index a5ab0d0..664fc7e 100644 --- a/SwiftIO/SocketAckHandler.swift +++ b/SwiftIO/SocketAckHandler.swift @@ -31,10 +31,13 @@ public typealias AckCallback = (NSArray?) -> Void let event:String! var acked = false var callback:AckCallback? + weak var socket:SocketIOClient? + - init(event:String, ackNum:Int = 0) { + init(event:String, ackNum:Int = 0, socket:SocketIOClient) { self.ackNum = ackNum self.event = event + self.socket = socket } public func onAck(timeout:UInt64, withCallback callback:AckCallback) { @@ -50,6 +53,7 @@ public typealias AckCallback = (NSArray?) -> Void if !self!.acked { self?.executeAck(["No ACK"]) + self?.socket?.removeAck(self!) } } } diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index 330ffbf..b9dc716 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -198,11 +198,12 @@ public class SocketIOClient: NSObject { public func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler { if !self.connected { - return SocketAckHandler(event: "fail") + return SocketAckHandler(event: "fail", socket: self) } self.currentAck++ - let ackHandler = SocketAckHandler(event: event, ackNum: self.currentAck) + let ackHandler = SocketAckHandler(event: event, + ackNum: self.currentAck, socket: self) self.ackHandlers.append(ackHandler) dispatch_async(self.emitQueue) {[weak self] in @@ -385,6 +386,10 @@ public class SocketIOClient: NSObject { } } + func removeAck(ack:SocketAckHandler) { + self.ackHandlers = self.ackHandlers.filter {$0 === ack ? false : true} + } + // We lost connection and should attempt to reestablish func tryReconnect() { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {