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 diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 345c7b8..ab12640 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -83,15 +83,39 @@ 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 } - 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..c70685b 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. @@ -499,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. 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