Skip to content

Commit 1aa1a83

Browse files
committed
Fix memory leak. Add reconnect method
1 parent 8a23960 commit 1aa1a83

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

SocketIOClientSwift/SocketEngine.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
121121

122122
self.write("", withType: PacketType.CLOSE, withData: nil)
123123
self.ws?.disconnect()
124-
124+
self.stopPolling()
125+
125126
if fast || self.polling {
126127
self.client?.engineDidClose("Disconnect")
127128
}
@@ -252,7 +253,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
252253
SocketLogger.log("Got polling response", client: self!)
253254

254255
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
255-
dispatch_async(self!.parseQueue) {
256+
dispatch_async(self!.parseQueue) {[weak self] in
256257
self?.parsePollingMessage(str)
257258
}
258259
}
@@ -337,7 +338,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
337338
}
338339

339340
self?.waitingForPost = false
340-
dispatch_async(self!.emitQueue) {
341+
dispatch_async(self!.emitQueue) {[weak self] in
341342
if !self!.fastUpgrade {
342343
self?.flushWaitingForPost()
343344
self?.doPoll()
@@ -363,7 +364,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
363364
self.waitingForPoll = false
364365
self.waitingForPost = false
365366

366-
if self.client == nil {
367+
// If cancelled we were already closing
368+
if self.client == nil || reason == "cancelled" {
367369
return
368370
}
369371

@@ -445,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
445447

446448
if let lengthInt = length.toInt() {
447449
if lengthInt != msg.length {
448-
NSLog("parsing error: \(str)")
450+
SocketLogger.err("parsing error: \(str)", client: self)
449451
return
450452
}
451453
}
@@ -630,13 +632,21 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
630632
}
631633

632634
self.pingTimer?.invalidate()
633-
dispatch_async(dispatch_get_main_queue()) {
634-
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self.pingInterval!),
635-
target: self,
635+
dispatch_async(dispatch_get_main_queue()) {[weak self] in
636+
if self == nil {
637+
return
638+
}
639+
640+
self?.pingTimer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(self!.pingInterval!),
641+
target: self!,
636642
selector: Selector("sendPing"), userInfo: nil, repeats: true)
637643
}
638644
}
639645

646+
func stopPolling() {
647+
self.session.invalidateAndCancel()
648+
}
649+
640650
private func upgradeTransport() {
641651
if self.websocketConnected {
642652
SocketLogger.log("Upgrading transport to WebSockets", client: self)

SocketIOClientSwift/SocketIOClient.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
153153
self._connected = false
154154
self._reconnecting = false
155155
self.engine?.close(fast: fast)
156+
self.engine = nil
156157
}
157158

158159
/**
@@ -454,8 +455,20 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
454455
SocketParser.parseBinaryData(data, socket: self)
455456
}
456457

458+
/**
459+
Trieds to reconnect to the server.
460+
*/
461+
public func reconnect() {
462+
self._connected = false
463+
self._connecting = false
464+
self._reconnecting = false
465+
466+
self.engine?.stopPolling()
467+
self.tryReconnect()
468+
}
469+
457470
// We lost connection and should attempt to reestablish
458-
func tryReconnect() {
471+
@objc private func tryReconnect() {
459472
if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
460473
self.didDisconnect("Reconnect Failed")
461474
return

0 commit comments

Comments
 (0)