@@ -44,7 +44,6 @@ public enum PacketType:String {
4444}
4545
4646public class SocketEngine : NSObject , WebSocketDelegate {
47- unowned let client : SocketEngineClient
4847 private let workQueue = NSOperationQueue ( )
4948 private let emitQueue = dispatch_queue_create (
5049 " engineEmitQueue " . cStringUsingEncoding ( NSUTF8StringEncoding) , DISPATCH_QUEUE_SERIAL)
@@ -70,6 +69,8 @@ public class SocketEngine: NSObject, WebSocketDelegate {
7069 var connected : Bool {
7170 return self . _connected
7271 }
72+
73+ weak var client : SocketEngineClient ?
7374 var cookies : [ NSHTTPCookie ] ?
7475 var pingInterval : Int ?
7576 var polling : Bool {
@@ -97,16 +98,14 @@ public class SocketEngine: NSObject, WebSocketDelegate {
9798 self . pingTimer? . invalidate ( )
9899 self . closed = true
99100
100- if self . polling {
101- self . write ( " " , withType: PacketType . CLOSE, withData: nil )
102- self . client. didForceClose ( " Disconnect " )
103- } else {
104- self . ws? . disconnect ( )
105-
106- if fast {
107- self . client. didForceClose ( " Fast Disconnect " )
108- }
101+ self . write ( " " , withType: PacketType . CLOSE, withData: nil )
102+ self . ws? . disconnect ( )
103+
104+ if fast || self . polling {
105+ self . client? . didForceClose ( " Disconnect " )
109106 }
107+
108+ self . client = nil
110109 }
111110
112111 private func createBinaryDataForSend( data: NSData ) -> ( NSData ? , String ? ) {
@@ -126,11 +125,15 @@ public class SocketEngine: NSObject, WebSocketDelegate {
126125 }
127126
128127 private func createURLs( params: [ String : AnyObject ] ? ) -> ( String , String ) {
129- var url = " \( self . client. socketURL) /socket.io/?transport= "
128+ if self . client == nil {
129+ return ( " " , " " )
130+ }
131+
132+ var url = " \( self . client!. socketURL) /socket.io/?transport= "
130133 var urlPolling : String
131134 var urlWebSocket : String
132135
133- if self . client. secure {
136+ if self . client! . secure {
134137 urlPolling = " https:// " + url + " polling "
135138 urlWebSocket = " wss:// " + url + " websocket "
136139 } else {
@@ -320,10 +323,14 @@ public class SocketEngine: NSObject, WebSocketDelegate {
320323 self . waitingForPoll = false
321324 self . waitingForPost = false
322325
323- if !self . closed && !self . client. reconnecting {
324- self . client. pollingDidFail ( reason)
325- } else if !self . client. reconnecting {
326- self . client. didForceClose ( reason)
326+ if self . client == nil {
327+ return
328+ }
329+
330+ if !self . closed && !self . client!. reconnecting {
331+ self . client? . pollingDidFail ( reason)
332+ } else if !self . client!. reconnecting {
333+ self . client? . didForceClose ( reason)
327334 }
328335 }
329336
@@ -413,8 +420,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
413420 }
414421
415422 private func parseEngineData( data: NSData ) {
416- dispatch_async ( self . client. handleQueue) { [ weak self] in
417- self ? . client. parseBinaryData ( data. subdataWithRange ( NSMakeRange ( 1 , data. length - 1 ) ) )
423+ if self . client == nil {
424+ return
425+ }
426+
427+ dispatch_async ( self . client!. handleQueue) { [ weak self] in
428+ self ? . client? . parseBinaryData ( data. subdataWithRange ( NSMakeRange ( 1 , data. length - 1 ) ) )
418429 return
419430 }
420431 }
@@ -438,8 +449,13 @@ public class SocketEngine: NSObject, WebSocketDelegate {
438449 if let data = NSData ( base64EncodedString: message,
439450 options: NSDataBase64DecodingOptions . IgnoreUnknownCharacters) {
440451 // println("sending \(data)")
441- dispatch_async ( self . client. handleQueue) { [ weak self] in
442- self ? . client. parseBinaryData ( data)
452+
453+ if self . client == nil {
454+ return
455+ }
456+
457+ dispatch_async ( self . client!. handleQueue) { [ weak self] in
458+ self ? . client? . parseBinaryData ( data)
443459 return
444460 }
445461 }
@@ -491,8 +507,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
491507
492508 return
493509 } else if type == PacketType . CLOSE. rawValue {
510+ if self . client == nil {
511+ return
512+ }
513+
494514 if self . polling {
495- self . client. didForceClose ( " Disconnect " )
515+ self . client! . didForceClose ( " Disconnect " )
496516 }
497517
498518 return
@@ -504,8 +524,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
504524 // Remove message type
505525 message. removeAtIndex ( message. startIndex)
506526
507- dispatch_async ( self . client. handleQueue) { [ weak self] in
508- self ? . client. parseSocketMessage ( message)
527+ if self . client == nil {
528+ return
529+ }
530+
531+ dispatch_async ( self . client!. handleQueue) { [ weak self] in
532+ self ? . client? . parseSocketMessage ( message)
509533 return
510534 }
511535 }
@@ -633,7 +657,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
633657 self . _websocket = false
634658
635659 let reason = error? . localizedDescription
636- self . client. webSocketDidCloseWithCode ( 1 ,
660+ self . client? . webSocketDidCloseWithCode ( 1 ,
637661 reason: reason == nil ? " Socket Disconnected " : reason!)
638662 } else {
639663 self . flushProbeWait ( )
0 commit comments