Skip to content

Commit 6e5b95b

Browse files
committed
1 parent ccad13a commit 6e5b95b

File tree

2 files changed

+58
-11
lines changed

2 files changed

+58
-11
lines changed

SocketIO-MacTests/SocketSideEffectTest.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,36 @@ class SocketSideEffectTest: XCTestCase {
5757
waitForExpectationsWithTimeout(3, handler: nil)
5858
}
5959

60+
func testHandleOnceEvent() {
61+
let expectation = expectationWithDescription("handled event")
62+
socket.once("test") {data, ack in
63+
XCTAssertEqual(data[0] as? String, "hello world")
64+
XCTAssertEqual(self.socket.testHandlers.count, 0)
65+
expectation.fulfill()
66+
}
67+
68+
socket.parseSocketMessage("2[\"test\",\"hello world\"]")
69+
waitForExpectationsWithTimeout(3, handler: nil)
70+
}
71+
72+
func testOffWithEvent() {
73+
socket.on("test") {data, ack in }
74+
XCTAssertEqual(socket.testHandlers.count, 1)
75+
socket.on("test") {data, ack in }
76+
XCTAssertEqual(socket.testHandlers.count, 2)
77+
socket.off("test")
78+
XCTAssertEqual(socket.testHandlers.count, 0)
79+
}
80+
81+
func testOffWithId() {
82+
let handler = socket.on("test") {data, ack in }
83+
XCTAssertEqual(socket.testHandlers.count, 1)
84+
socket.on("test") {data, ack in }
85+
XCTAssertEqual(socket.testHandlers.count, 2)
86+
socket.off(id: handler)
87+
XCTAssertEqual(socket.testHandlers.count, 1)
88+
}
89+
6090
func testHandleBinaryEvent() {
6191
let expectation = expectationWithDescription("handled binary event")
6292
socket.on("test") {data, ack in

Source/SocketIOClient.swift

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -389,39 +389,44 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
389389
handlers = handlers.filter { $0.event != event }
390390
}
391391

392+
/**
393+
Removes a handler with the specified UUID gotten from an `on` or `once`
394+
*/
395+
public func off(id id: NSUUID) {
396+
DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: logType, args: id)
397+
398+
handlers = handlers.filter { $0.id != id }
399+
}
400+
392401
/**
393402
Adds a handler for an event.
394403
*/
395-
public func on(event: String, callback: NormalCallback) {
404+
public func on(event: String, callback: NormalCallback) -> NSUUID {
396405
DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event)
397406

398407
let handler = SocketEventHandler(event: event, id: NSUUID(), callback: callback)
399408
handlers.append(handler)
409+
410+
return handler.id
400411
}
401412

402413
/**
403414
Adds a single-use handler for an event.
404415
*/
405-
public func once(event: String, callback: NormalCallback) {
416+
public func once(event: String, callback: NormalCallback) -> NSUUID {
406417
DefaultSocketLogger.Logger.log("Adding once handler for event: %@", type: logType, args: event)
407418

408419
let id = NSUUID()
409420

410421
let handler = SocketEventHandler(event: event, id: id) {[weak self] data, ack in
411422
guard let this = self else {return}
412-
this.handlers = this.handlers.filter {$0.id != id}
423+
this.off(id: id)
413424
callback(data, ack)
414425
}
415426

416427
handlers.append(handler)
417-
}
418-
419-
/**
420-
Removes all handlers.
421-
Can be used after disconnecting to break any potential remaining retain cycles.
422-
*/
423-
public func removeAllHandlers() {
424-
handlers.removeAll(keepCapacity: false)
428+
429+
return handler.id
425430
}
426431

427432
/**
@@ -457,6 +462,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
457462
tryReconnect()
458463
}
459464

465+
/**
466+
Removes all handlers.
467+
Can be used after disconnecting to break any potential remaining retain cycles.
468+
*/
469+
public func removeAllHandlers() {
470+
handlers.removeAll(keepCapacity: false)
471+
}
472+
460473
private func tryReconnect() {
461474
if reconnectTimer == nil {
462475
DefaultSocketLogger.Logger.log("Starting reconnect", type: logType)
@@ -495,6 +508,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient {
495508

496509
// Test extensions
497510
extension SocketIOClient {
511+
var testHandlers: [SocketEventHandler] {
512+
return handlers
513+
}
514+
498515
func setTestable() {
499516
status = .Connected
500517
}

0 commit comments

Comments
 (0)