diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2660092..8260eed 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -26,14 +26,11 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient { private var anyHandler:((SocketAnyEvent) -> Void)? - private var _closed = false - private var _connected = false - private var _connecting = false + public private(set) var status = SocketIOClientStatus.NotConnected private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() private var connectParams:[String: AnyObject]? private var _secure = false - private var _reconnecting = false private var reconnectTimer:NSTimer? let reconnectAttempts:Int! @@ -48,22 +45,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) - public var closed:Bool { - return _closed - } - public var connected:Bool { - return _connected - } - public var connecting:Bool { - return _connecting - } public var engine:SocketEngine? public var nsp = "/" public var opts:[String: AnyObject]? public var reconnects = true - public var reconnecting:Bool { - return _reconnecting - } + public var reconnectWait = 10 public var secure:Bool { return _secure @@ -145,9 +131,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient SocketLogger.log("Closing socket", client: self) reconnects = false - _connecting = false - _connected = false - _reconnecting = false + status = SocketIOClientStatus.Closed engine?.close(fast: fast) engine = nil } @@ -163,14 +147,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Connect to the server. If we aren't connected after timeoutAfter, call handler */ public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { - if closed { - SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) - _closed = false - } else if connected { + guard status == SocketIOClientStatus.Connected else { return } + if status == SocketIOClientStatus.Closed { + SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) + } - _connecting = true + status = SocketIOClientStatus.Connecting addEngine() engine?.open(connectParams) @@ -181,9 +165,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) dispatch_after(time, dispatch_get_main_queue()) {[weak self] in - if let this = self where !this.connected { - this._closed = true - this._connecting = false + if let this = self where this.status != SocketIOClientStatus.Connected { + this.status = SocketIOClientStatus.Closed this.engine?.close(fast: true) handler?() @@ -213,11 +196,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient func didConnect() { SocketLogger.log("Socket connected", client: self) - - _closed = false - _connected = true - _connecting = false - _reconnecting = false + status = SocketIOClientStatus.Connected currentReconnectAttempt = 0 clearReconnectTimer() @@ -227,17 +206,15 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } func didDisconnect(reason:String) { - if closed { + guard status == SocketIOClientStatus.Closed else { return } SocketLogger.log("Disconnected: %@", client: self, args: reason) - _closed = true - _connected = false + status = SocketIOClientStatus.Closed + reconnects = false - _connecting = false - _reconnecting = false // Make sure the engine is actually dead. engine?.close(fast: true) @@ -263,10 +240,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Send a message to the server */ public func emit(event:String, _ items:AnyObject...) { - if !connected { + guard status == SocketIOClientStatus.Connected else { return } - dispatch_async(emitQueue) {[weak self] in self?._emit(event, items) } @@ -276,7 +252,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Same as emit, but meant for Objective-C */ public func emit(event:String, withItems items:[AnyObject]) { - if !connected { + guard status != SocketIOClientStatus.Connected else { return } @@ -290,10 +266,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient an ack. */ public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { - if !connected { - return createOnAck(event, items: items) - } - return createOnAck(event, items: items) } @@ -301,15 +273,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Same as emitWithAck, but for Objective-C */ public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { - if !connected { - return createOnAck(event, items: items) - } - return createOnAck(event, items: items) } private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { - if !connected { + guard status != SocketIOClientStatus.Connected else { return } @@ -328,7 +296,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient // If the server wants to know that the client received data func emitAck(ack:Int, withData args:[AnyObject]) { dispatch_async(emitQueue) {[weak self] in - if let this = self where this.connected { + if let this = self where this.status == SocketIOClientStatus.Connected { let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) let str = packet.createAck() @@ -345,12 +313,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } public func engineDidClose(reason:String) { - _connected = false - _connecting = false - - if closed || !reconnects { + if status == SocketIOClientStatus.Closed || !reconnects { didDisconnect(reason) - } else if !reconnecting { + } else if status != SocketIOClientStatus.Reconnecting { handleEvent("reconnect", data: [reason], isInternalMessage: true) tryReconnect() } @@ -370,10 +335,10 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient */ public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, wantsAck ack:Int? = nil) { - // println("Should do event: \(event) with data: \(data)") - if !connected && !isInternalMessage { + guard status != SocketIOClientStatus.Connected && !isInternalMessage else { return } + // println("Should do event: \(event) with data: \(data)") SocketLogger.log("Handling event: %@ with data: %@", client: self, args: event, data ?? "") @@ -467,31 +432,27 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Trieds to reconnect to the server. */ public func reconnect() { - _connected = false - _connecting = false - _reconnecting = false - + status = SocketIOClientStatus.Reconnecting engine?.stopPolling() tryReconnect() } // We lost connection and should attempt to reestablish @objc private func tryReconnect() { + guard status == SocketIOClientStatus.Connected else { + return + } if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() didDisconnect("Reconnect Failed") - return - } else if connected { - _connecting = false - _reconnecting = false return } if reconnectTimer == nil { SocketLogger.log("Starting reconnect", client: self) - _reconnecting = true + status = SocketIOClientStatus.Reconnecting dispatch_async(dispatch_get_main_queue()) {[weak self] in if let this = self { diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index 596a267..0009677 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -28,3 +28,7 @@ public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias OnAckCallback = (timeout:UInt64, callback:AckCallback) -> Void + +public enum SocketIOClientStatus { + case NotConnected, Closed, Connecting, Connected, Reconnecting +}