From c17767111224390a1891fd21755af73da75a0a23 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 14 Mar 2015 14:11:32 -0400 Subject: [PATCH 1/2] work on #23 --- SwiftIO/SocketAckHandler.swift | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/SwiftIO/SocketAckHandler.swift b/SwiftIO/SocketAckHandler.swift index bc506a0..e042020 100644 --- a/SwiftIO/SocketAckHandler.swift +++ b/SwiftIO/SocketAckHandler.swift @@ -29,6 +29,7 @@ public typealias AckCallback = (NSArray?) -> Void @objc public class SocketAckHandler { let ackNum:Int! let event:String! + var acked = false var callback:AckCallback? init(event:String, ackNum:Int = 0) { @@ -36,12 +37,24 @@ public typealias AckCallback = (NSArray?) -> Void self.event = event } - func onAck(callback:AckCallback) { + public func onAck(timeout:UInt64, withCallback callback:AckCallback) { self.callback = callback + + let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) + dispatch_after(time, dispatch_get_main_queue()) {[weak self] in + if self == nil { + return + } + + if !self!.acked { + self?.executeAck(["No ACK"]) + } + } } func executeAck(data:NSArray?) { - dispatch_async(dispatch_get_main_queue()) {[cb = self.callback] in + dispatch_async(dispatch_get_main_queue()) {[weak self, cb = self.callback] in + self?.acked = true cb?(data) return } From 2022f282c92ac235adb42a1d5e3045cfb7d2048d Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 14 Mar 2015 19:46:03 -0400 Subject: [PATCH 2/2] add no timeout --- README.md | 3 ++- SwiftIO/SocketAckHandler.swift | 19 +++++++++++-------- SwiftIO/SocketIOClient.swift | 3 ++- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 63b0744..d197693 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,8 @@ socket.on("ackEvent") {data, ack in println("Got int") } - socket.emitWithAck("ackTest", "test").onAck {data in + // You can specify a custom timeout interval. 0 means no timeout. + socket.emitWithAck("ackTest", "test").onAck(0) {data in println(data?[0]) } diff --git a/SwiftIO/SocketAckHandler.swift b/SwiftIO/SocketAckHandler.swift index e042020..a5ab0d0 100644 --- a/SwiftIO/SocketAckHandler.swift +++ b/SwiftIO/SocketAckHandler.swift @@ -40,14 +40,17 @@ public typealias AckCallback = (NSArray?) -> Void public func onAck(timeout:UInt64, withCallback callback:AckCallback) { self.callback = callback - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) - dispatch_after(time, dispatch_get_main_queue()) {[weak self] in - if self == nil { - return - } - - if !self!.acked { - self?.executeAck(["No ACK"]) + + if timeout != 0 { + let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) + dispatch_after(time, dispatch_get_main_queue()) {[weak self] in + if self == nil { + return + } + + if !self!.acked { + self?.executeAck(["No ACK"]) + } } } } diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index f160e64..2e28c67 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -50,7 +50,7 @@ public class SocketIOClient: NSObject { internal var currentAck = -1 internal var waitingData = [SocketEvent]() - + public var closed:Bool { return self._closed } @@ -396,6 +396,7 @@ public class SocketIOClient: NSObject { if self.reconnectTimer == nil { self._reconnecting = true + dispatch_async(dispatch_get_main_queue()) {[weak self] in if self == nil { return