@@ -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
497510extension SocketIOClient {
511+ var testHandlers : [ SocketEventHandler ] {
512+ return handlers
513+ }
514+
498515 func setTestable( ) {
499516 status = . Connected
500517 }
0 commit comments