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