diff --git a/README.md b/README.md index 80234b1..9c29b6a 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,8 @@ Methods 11. `reconnect()` - Causes the client to reconnect to the server. 12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. 13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / +14. `once(event: String, callback: NormalCallback)` - Adds a handler that will only be executed once. +15. `once(event event: String, callback: NormalCallbackObjectiveC)` - Adds a handler that will only be executed once. Client Events ------ diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index c61c4c5..beb88a6 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -35,19 +35,21 @@ private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) } struct SocketEventHandler { - let id = NSUUID() let event: String + let id: NSUUID let callback: NormalCallback? let callBackObjectiveC: NormalCallbackObjectiveC? - init(event: String, callback: NormalCallback) { + init(event: String, id: NSUUID = NSUUID(), callback: NormalCallback) { self.event = event + self.id = id self.callback = callback self.callBackObjectiveC = nil } - init(event: String, callback: NormalCallbackObjectiveC) { + init(event: String, id: NSUUID = NSUUID(), callback: NormalCallbackObjectiveC) { self.event = event + self.id = id self.callback = nil self.callBackObjectiveC = callback } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c9fdad0..00b328a 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,14 +430,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { 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 }) + let id = NSUUID() + + let handler = SocketEventHandler(event: event, id: id) {[weak self] (data, ack: AckEmitter?) in + guard let this = self else {return} + this.handlers = ContiguousArray(this.handlers.filter {$0.id != id}) callback(data, ack) } - handlers.append(handler!) + handlers.append(handler) } /** @@ -446,14 +447,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient { 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 }) + let id = NSUUID() + + let handler = SocketEventHandler(event: event, id: id) {[weak self] (data, ack: AckEmitterObjectiveC?) in + guard let this = self else {return} + this.handlers = ContiguousArray(this.handlers.filter {$0.id != id}) callback(data, ack) } - - handlers.append(handler!) + + handlers.append(handler) } /**