From 6d7ca472a303173f892b4617912b00df294f62d5 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 17 Aug 2017 09:20:03 -0400 Subject: [PATCH 1/4] Add off for client events. Fixes #773 --- SocketIO-MacTests/SocketSideEffectTest.swift | 10 +++++++++- Source/SocketIOClient.swift | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 345c7b8..f281e98 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -85,13 +85,21 @@ class SocketSideEffectTest: XCTestCase { func testOffWithEvent() { socket.on("test") {data, ack in } - XCTAssertEqual(socket.testHandlers.count, 1) socket.on("test") {data, ack in } XCTAssertEqual(socket.testHandlers.count, 2) socket.off("test") XCTAssertEqual(socket.testHandlers.count, 0) } + func testOffClientEvent() { + socket.on(clientEvent: .connect) {data, ack in } + socket.on(clientEvent: .disconnect) {data, ack in } + XCTAssertEqual(socket.testHandlers.count, 2) + socket.off(clientEvent: .disconnect) + XCTAssertEqual(socket.testHandlers.count, 1) + XCTAssertTrue(socket.testHandlers.contains(where: { $0.event == "connect" })) + } + func testOffWithId() { let handler = socket.on("test") {data, ack in } XCTAssertEqual(socket.testHandlers.count, 1) diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index 1aba6c1..c7d3928 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -439,6 +439,15 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } } + /// Removes handler(s) for a client event. + /// + /// If you wish to remove a client event handler, call the `off(id:)` with the UUID received from its `on` call. + /// + /// - parameter clientEvent: The event to remove handlers for. + open func off(clientEvent event: SocketClientEvent) { + off(event.rawValue) + } + /// Removes handler(s) based on an event name. /// /// If you wish to remove a specific event, call the `off(id:)` with the UUID received from its `on` call. From 7a16d157f7e2a446025574ed9b50087407663958 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 17 Aug 2017 09:34:23 -0400 Subject: [PATCH 2/4] Bump starscream dep --- Socket.IO-Client-Swift.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index d746af8..f92ea64 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -24,5 +24,5 @@ Pod::Spec.new do |s| 'SWIFT_VERSION' => '3.1' } s.source_files = "Source/*.swift" - s.dependency "StarscreamSocketIO", "~> 8.0.2" + s.dependency "StarscreamSocketIO", "~> 8.0.3" end From 18efea4bad8c94e409c18ce6f409ef58840428d5 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 17 Aug 2017 09:52:16 -0400 Subject: [PATCH 3/4] Update starscream repo --- Source/Starscream | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Starscream b/Source/Starscream index 53003d3..4ae6fe9 160000 --- a/Source/Starscream +++ b/Source/Starscream @@ -1 +1 @@ -Subproject commit 53003d342e17c8cdf54924adfb8a18a056a58c3d +Subproject commit 4ae6fe995316a49e7ac4ee0aaba9b3a0ba7f774d From 5621f0dbe17cd5bbd5bf82493d1556738abf4371 Mon Sep 17 00:00:00 2001 From: Erik Little Date: Thu, 17 Aug 2017 10:08:51 -0400 Subject: [PATCH 4/4] Add once for client events --- SocketIO-MacTests/SocketSideEffectTest.swift | 16 ++++++++++++++++ Source/SocketIOClient.swift | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index f281e98..ab12640 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -83,6 +83,22 @@ class SocketSideEffectTest: XCTestCase { waitForExpectations(timeout: 3, handler: nil) } + func testHandleOnceClientEvent() { + let expect = expectation(description: "handled event") + + socket.once(clientEvent: .connect) {data, ack in + XCTAssertEqual(self.socket.testHandlers.count, 0) + expect.fulfill() + } + + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { + // Fake connecting + self.socket.parseEngineMessage("0/") + } + + waitForExpectations(timeout: 3, handler: nil) + } + func testOffWithEvent() { socket.on("test") {data, ack in } socket.on("test") {data, ack in } diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index c7d3928..c70685b 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -508,6 +508,16 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So return handler.id } + /// Adds a single-use handler for a client event. + /// + /// - parameter clientEvent: The event for this handler. + /// - parameter callback: The callback that will execute when this event is received. + /// - returns: A unique id for the handler that can be used to remove it. + @discardableResult + open func once(clientEvent event: SocketClientEvent, callback: @escaping NormalCallback) -> UUID { + return once(event.rawValue, callback: callback) + } + /// Adds a single-use handler for an event. /// /// - parameter event: The event name for this handler.