Skip to content

Commit 9489676

Browse files
committed
use weak references to client
1 parent 6e56869 commit 9489676

File tree

2 files changed

+49
-24
lines changed

2 files changed

+49
-24
lines changed

SwiftIO/SocketEngine.swift

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public enum PacketType:String {
4444
}
4545

4646
public 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()

SwiftIO/SocketIOClient.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
204204

205205
if timeout != 0 {
206206
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC))
207+
207208
dispatch_after(time, dispatch_get_main_queue()) {
208209
self?.ackHandlers.timeoutAck(ack)
209210
return

0 commit comments

Comments
 (0)