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 bc506a0..a5ab0d0 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,27 @@ public typealias AckCallback = (NSArray?) -> Void self.event = event } - func onAck(callback:AckCallback) { + public func onAck(timeout:UInt64, withCallback callback:AckCallback) { self.callback = callback + + + 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"]) + } + } + } } 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 }