diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index 6c2d523..e453159 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -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) diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index c245525..669a5d6 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -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