diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 67b1fa5..e5877c9 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Socket.IO-Client-Swift" - s.version = "1.2.0" + s.version = "1.2.1" s.summary = "Socket.IO-client for Swift" s.description = <<-DESC Socket.IO-client for Swift. @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.author = { "Erik" => "nuclear.ace@gmail.com" } s.ios.deployment_target = '8.0' s.osx.deployment_target = '10.10' - s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.2.0' } + s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.2.1' } s.source_files = "SwiftIO/**/*.swift" s.requires_arc = true # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files 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..27afb7d 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -198,15 +198,16 @@ 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 - self?._emit(event, args, ack: true) + dispatch_async(self.emitQueue) {[weak self, ack = self.currentAck] in + self?._emit(event, args, ack: ack) return } @@ -217,7 +218,7 @@ public class SocketIOClient: NSObject { return self.emitWithAck(event, args) } - private func _emit(event:String, _ args:[AnyObject], ack:Bool = false) { + private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { var frame:SocketEvent var str:String @@ -228,22 +229,22 @@ public class SocketIOClient: NSObject { } if hasBinary { - if !ack { + if ack == nil { str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp) } else { str = SocketEvent.createMessageForEvent(event, withArgs: items, - hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: self.currentAck) + hasBinary: true, withDatas: emitDatas.count, toNamespace: self.nsp, wantsAck: ack) } self.engine?.send(str, datas: emitDatas) } else { - if !ack { + if ack == nil { str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, withDatas: 0, toNamespace: self.nsp) } else { str = SocketEvent.createMessageForEvent(event, withArgs: items, hasBinary: false, - withDatas: 0, toNamespace: self.nsp, wantsAck: self.currentAck) + withDatas: 0, toNamespace: self.nsp, wantsAck: ack) } self.engine?.send(str) @@ -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 {