Fix memory leak. Add reconnect method

This commit is contained in:
Erik 2015-04-27 12:22:59 -04:00
parent 8a23960e20
commit 1aa1a83cea
2 changed files with 32 additions and 9 deletions

View File

@ -121,6 +121,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
self.write("", withType: PacketType.CLOSE, withData: nil) self.write("", withType: PacketType.CLOSE, withData: nil)
self.ws?.disconnect() self.ws?.disconnect()
self.stopPolling()
if fast || self.polling { if fast || self.polling {
self.client?.engineDidClose("Disconnect") self.client?.engineDidClose("Disconnect")
@ -252,7 +253,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
SocketLogger.log("Got polling response", client: self!) SocketLogger.log("Got polling response", client: self!)
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String { if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
dispatch_async(self!.parseQueue) { dispatch_async(self!.parseQueue) {[weak self] in
self?.parsePollingMessage(str) self?.parsePollingMessage(str)
} }
} }
@ -337,7 +338,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
self?.waitingForPost = false self?.waitingForPost = false
dispatch_async(self!.emitQueue) { dispatch_async(self!.emitQueue) {[weak self] in
if !self!.fastUpgrade { if !self!.fastUpgrade {
self?.flushWaitingForPost() self?.flushWaitingForPost()
self?.doPoll() self?.doPoll()
@ -363,7 +364,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
self.waitingForPoll = false self.waitingForPoll = false
self.waitingForPost = false self.waitingForPost = false
if self.client == nil { // If cancelled we were already closing
if self.client == nil || reason == "cancelled" {
return return
} }
@ -445,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
if let lengthInt = length.toInt() { if let lengthInt = length.toInt() {
if lengthInt != msg.length { if lengthInt != msg.length {
NSLog("parsing error: \(str)") SocketLogger.err("parsing error: \(str)", client: self)
return return
} }
} }
@ -630,13 +632,21 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {[weak self] in
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self.pingInterval!), if self == nil {
target: self, return
}
self?.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self!.pingInterval!),
target: self!,
selector: Selector("sendPing"), userInfo: nil, repeats: true) selector: Selector("sendPing"), userInfo: nil, repeats: true)
} }
} }
func stopPolling() {
self.session.invalidateAndCancel()
}
private func upgradeTransport() { private func upgradeTransport() {
if self.websocketConnected { if self.websocketConnected {
SocketLogger.log("Upgrading transport to WebSockets", client: self) SocketLogger.log("Upgrading transport to WebSockets", client: self)

View File

@ -153,6 +153,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
self._connected = false self._connected = false
self._reconnecting = false self._reconnecting = false
self.engine?.close(fast: fast) self.engine?.close(fast: fast)
self.engine = nil
} }
/** /**
@ -454,8 +455,20 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
SocketParser.parseBinaryData(data, socket: self) SocketParser.parseBinaryData(data, socket: self)
} }
/**
Trieds to reconnect to the server.
*/
public func reconnect() {
self._connected = false
self._connecting = false
self._reconnecting = false
self.engine?.stopPolling()
self.tryReconnect()
}
// We lost connection and should attempt to reestablish // We lost connection and should attempt to reestablish
func tryReconnect() { @objc private func tryReconnect() {
if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
self.didDisconnect("Reconnect Failed") self.didDisconnect("Reconnect Failed")
return return