diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 05efb10..c61c4c5 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -35,6 +35,7 @@ private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) } struct SocketEventHandler { + let id = NSUUID() let event: String let callback: NormalCallback? let callBackObjectiveC: NormalCallbackObjectiveC? diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index cd52b69..c9fdad0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -424,6 +424,38 @@ public final class SocketIOClient: NSObject, SocketEngineClient { handlers.append(handler) } + /** + Adds a single-use handler for an event. + */ + public func once(event: String, callback: NormalCallback) { + Logger.log("Adding once handler for event: %@", type: logType, args: event) + + var handler: SocketEventHandler?; + + handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) + callback(data, ack) + } + + handlers.append(handler!) + } + + /** + Adds a single-use handler for an event. + */ + public func once(event event: String, callback: NormalCallbackObjectiveC) { + Logger.log("Adding once handler for event: %@", type: logType, args: event) + + var handler: SocketEventHandler?; + + handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) + callback(data, ack) + } + + handlers.append(handler!) + } + /** Removes all handlers. Can be used after disconnecting to break any potential remaining retain cycles.