@@ -33,21 +33,23 @@ class SocketIOClient {
3333 DISPATCH_QUEUE_SERIAL)
3434 let emitQueue = dispatch_queue_create ( " emitQueue " . cStringUsingEncoding ( NSUTF8StringEncoding) ,
3535 DISPATCH_QUEUE_SERIAL)
36- private lazy var params : [ String : AnyObject ] = [ String: AnyObject] ( )
36+ let reconnectAttempts : Int !
37+ private lazy var params = [ String: AnyObject] ( )
3738 private var ackHandlers = [ SocketAckHandler] ( )
3839 private var currentAck = - 1
40+ private var currentReconnectAttempt = 0
3941 private var forcePolling = false
4042 private var handlers = [ SocketEventHandler] ( )
4143 private var waitingData = [ SocketEvent] ( )
4244 private var paramConnect = false
4345 private var _secure = false
46+ private var reconnectTimer : NSTimer ?
4447 var closed = false
4548 var connected = false
4649 var connecting = false
4750 var nsp : String ?
4851 var reconnects = true
4952 var reconnecting = false
50- var reconnectAttempts = - 1
5153 var reconnectWait = 10
5254 var secure : Bool {
5355 return self . _secure
@@ -65,6 +67,7 @@ class SocketIOClient {
6567 mutURL = mutURL [ " https:// " ] ~= " "
6668
6769 self . socketURL = mutURL
70+ self . reconnectAttempts = - 1
6871
6972 // Set options
7073 if opts != nil {
@@ -129,6 +132,9 @@ class SocketIOClient {
129132 self . connected = true
130133 self . connecting = false
131134 self . reconnecting = false
135+ self . currentReconnectAttempt = 0
136+ self . reconnectTimer? . invalidate ( )
137+ self . reconnectTimer = nil
132138 self . handleEvent ( " connect " , data: nil , isInternalMessage: false )
133139 }
134140
@@ -764,16 +770,15 @@ class SocketIOClient {
764770 // Something happened while polling
765771 func pollingDidFail( err: NSError ? ) {
766772 if !self . reconnecting {
773+ self . connected = false
767774 self . handleEvent ( " reconnect " , data: err? . localizedDescription, isInternalMessage: true )
768- self . tryReconnect ( triesLeft : self . reconnectAttempts )
775+ self . tryReconnect ( )
769776 }
770777 }
771778
772779 // We lost connection and should attempt to reestablish
773- func tryReconnect( var #triesLeft: Int ) {
774- self . connected = false
775-
776- if triesLeft != - 1 && triesLeft <= 0 {
780+ @objc func tryReconnect( ) {
781+ if self . reconnectAttempts != - 1 && self . currentReconnectAttempt + 1 > self . reconnectAttempts {
777782 self . didForceClose ( )
778783 return
779784 } else if self . connected {
@@ -782,26 +787,25 @@ class SocketIOClient {
782787 return
783788 }
784789
785- // println("Trying to reconnect #\(reconnectAttempts - triesLeft)")
786- self . handleEvent ( " reconnectAttempt " , data : triesLeft - 1 , isInternalMessage : true )
787-
788- let waitTime = UInt64 ( self . reconnectWait ) * NSEC_PER_SEC
789- let time = dispatch_time ( DISPATCH_TIME_NOW , Int64 ( waitTime ) )
790-
791- // Wait reconnectWait seconds and then check if connected. Repeat if not
792- dispatch_after ( time , dispatch_get_main_queue ( ) ) { [ weak self] in
793- if self == nil || self ! . connected || self !. closed {
790+ if self . reconnectTimer == nil {
791+ self . reconnecting = true
792+ dispatch_async ( dispatch_get_main_queue ( ) ) { [ weak self ] in
793+ if self == nil {
794+ return
795+ }
796+
797+ self ? . reconnectTimer = NSTimer . scheduledTimerWithTimeInterval ( Double ( self ! . reconnectWait ) ,
798+ target : self !, selector : " tryReconnect " , userInfo : nil , repeats : true )
794799 return
795800 }
796801
797- if triesLeft != - 1 {
798- triesLeft = triesLeft - 1
799- }
800-
801- self !. tryReconnect ( triesLeft: triesLeft)
802+ return
802803 }
803- self . reconnecting = true
804804
805+ self . handleEvent ( " reconnectAttempt " , data: self . reconnectAttempts - self . currentReconnectAttempt,
806+ isInternalMessage: true )
807+
808+ self . currentReconnectAttempt++
805809 if self . paramConnect {
806810 self . connectWithParams ( self . params)
807811 } else {
@@ -817,7 +821,7 @@ class SocketIOClient {
817821 self . didForceClose ( )
818822 } else {
819823 self . handleEvent ( " reconnect " , data: reason, isInternalMessage: true )
820- self . tryReconnect ( triesLeft : self . reconnectAttempts )
824+ self . tryReconnect ( )
821825 }
822826 }
823827
@@ -830,7 +834,7 @@ class SocketIOClient {
830834 self . didForceClose ( )
831835 } else if !self . reconnecting {
832836 self . handleEvent ( " reconnect " , data: error. localizedDescription, isInternalMessage: true )
833- self . tryReconnect ( triesLeft : self . reconnectAttempts )
837+ self . tryReconnect ( )
834838 }
835839 }
836840}
0 commit comments