From a72f96759e96091986af3785346406d063622165 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 18:19:49 -0400 Subject: [PATCH 1/8] Adds SocketIOClient#once(event, callback) When the specified event is emitted, the handler deregisters itself. --- SocketIOClientSwift/SocketIOClient.swift | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index cd52b69..aa6fdf8 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -424,6 +424,34 @@ 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) + + let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitter? in + handlers = ContiguousArray(handlers.filter { $0 != handler }) + 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) + + let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitterObjectiveC? in + handlers = ContiguousArray(handlers.filter { $0 != handler }) + callback?(data, ack) + } + + handlers.append(handler) + } + /** Removes all handlers. Can be used after disconnecting to break any potential remaining retain cycles. From 9b3f84dcd0873fed7b12b94d91bcc2e30b5ec6df Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 20:33:36 -0400 Subject: [PATCH 2/8] Remove type declarations --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index aa6fdf8..c4f2e64 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,8 +430,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitter? in - handlers = ContiguousArray(handlers.filter { $0 != handler }) + let handler = SocketEventHandler(event: event) { data, ack in + self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -444,8 +444,8 @@ 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) - let handler = SocketEventHandler(event: event) { data: NSArray?, ack: AckEmitterObjectiveC? in - handlers = ContiguousArray(handlers.filter { $0 != handler }) + let handler = SocketEventHandler(event: event) { data, ack in + self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From 136847fd77a8bcd92e4949efb2f6b1d2028bad9a Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 20:41:34 -0400 Subject: [PATCH 3/8] Fix "Variable used within its own initial value" error --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c4f2e64..3559c92 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,7 +430,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient { public func once(event: String, callback: NormalCallback) { Logger.log("Adding once handler for event: %@", type: logType, args: event) - let handler = SocketEventHandler(event: event) { data, ack in + var handler: SocketEventHandler; + + handler = SocketEventHandler(event: event) { data, ack in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -444,7 +446,9 @@ 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) - let handler = SocketEventHandler(event: event) { data, ack in + var handler: SocketEventHandler; + + handler = SocketEventHandler(event: event) { data, ack in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From 7d26bd3ee830a807e7ab5c937226504f4ee53be8 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:00:56 -0400 Subject: [PATCH 4/8] Fix type declarations --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 3559c92..e38071c 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -432,7 +432,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; - handler = SocketEventHandler(event: event) { data, ack in + handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } @@ -448,7 +448,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; - handler = SocketEventHandler(event: event) { data, ack in + handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) callback?(data, ack) } From f5c3a2cac9c57f17e5a7108a274e696d9af05b9a Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:08:37 -0400 Subject: [PATCH 5/8] Add strict equality and execute "callback" as non-optional --- SocketIOClientSwift/SocketIOClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index e38071c..1151420 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -433,8 +433,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) - callback?(data, ack) + self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + callback(data, ack) } handlers.append(handler) @@ -449,8 +449,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 != handler }) - callback?(data, ack) + self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + callback(data, ack) } handlers.append(handler) From fe8469cfc659850ce12dada944cf045c67f27323 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:48:09 -0400 Subject: [PATCH 6/8] Add SocketEventHandler#id to filter against --- SocketIOClientSwift/SocketEventHandler.swift | 1 + 1 file changed, 1 insertion(+) 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? From aaaf9dc451cba8bfca499cde078728ba7c49b4ec Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 21:49:18 -0400 Subject: [PATCH 7/8] Filter against SocketEventHandler#id --- SocketIOClientSwift/SocketIOClient.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 1151420..dba36c5 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -433,7 +433,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) callback(data, ack) } @@ -449,7 +449,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient { var handler: SocketEventHandler; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0 !== handler }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) callback(data, ack) } From a9b4193fe4051a5fc9edf443c3401b20c845fe98 Mon Sep 17 00:00:00 2001 From: Kevin Jose Martin Date: Thu, 17 Sep 2015 22:06:12 -0400 Subject: [PATCH 8/8] Fix "Variable 'handler' captured by a closure before being initialized" error --- SocketIOClientSwift/SocketIOClient.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index dba36c5..c9fdad0 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -430,14 +430,14 @@ 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; + var handler: SocketEventHandler?; handler = SocketEventHandler(event: event) { (data, ack: AckEmitter?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) callback(data, ack) } - handlers.append(handler) + handlers.append(handler!) } /** @@ -446,14 +446,14 @@ 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; + var handler: SocketEventHandler?; handler = SocketEventHandler(event: event) { (data, ack: AckEmitterObjectiveC?) in - self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler.id }) + self.handlers = ContiguousArray(self.handlers.filter { $0.id != handler!.id }) callback(data, ack) } - handlers.append(handler) + handlers.append(handler!) } /**