better reconnects

This commit is contained in:
Erik 2015-03-06 12:13:00 -05:00
parent 851ac7635a
commit 44bff82a43
2 changed files with 28 additions and 26 deletions

View File

@ -194,7 +194,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
} }
let postStr = self.postWait.reduce("") {$0 + $1} let postStr = self.postWait.reduce("") {$0 + $1}
assert(self.postWait.count != 0)
self.postWait.removeAll(keepCapacity: true) self.postWait.removeAll(keepCapacity: true)
var req = NSMutableURLRequest(URL: var req = NSMutableURLRequest(URL:
@ -221,7 +220,6 @@ class SocketEngine: NSObject, SRWebSocketDelegate {
self?.flushWaitingForPost() self?.flushWaitingForPost()
self?.waitingForPost = false self?.waitingForPost = false
self?.doPoll()
} }
} }

View File

@ -33,21 +33,23 @@ class SocketIOClient {
DISPATCH_QUEUE_SERIAL) DISPATCH_QUEUE_SERIAL)
let emitQueue = dispatch_queue_create("emitQueue".cStringUsingEncoding(NSUTF8StringEncoding), let emitQueue = dispatch_queue_create("emitQueue".cStringUsingEncoding(NSUTF8StringEncoding),
DISPATCH_QUEUE_SERIAL) DISPATCH_QUEUE_SERIAL)
private lazy var params:[String: AnyObject] = [String: AnyObject]() let reconnectAttempts:Int!
private lazy var params = [String: AnyObject]()
private var ackHandlers = [SocketAckHandler]() private var ackHandlers = [SocketAckHandler]()
private var currentAck = -1 private var currentAck = -1
private var currentReconnectAttempt = 0
private var forcePolling = false private var forcePolling = false
private var handlers = [SocketEventHandler]() private var handlers = [SocketEventHandler]()
private var waitingData = [SocketEvent]() private var waitingData = [SocketEvent]()
private var paramConnect = false private var paramConnect = false
private var _secure = false private var _secure = false
private var reconnectTimer:NSTimer?
var closed = false var closed = false
var connected = false var connected = false
var connecting = false var connecting = false
var nsp:String? var nsp:String?
var reconnects = true var reconnects = true
var reconnecting = false var reconnecting = false
var reconnectAttempts = -1
var reconnectWait = 10 var reconnectWait = 10
var secure:Bool { var secure:Bool {
return self._secure return self._secure
@ -65,6 +67,7 @@ class SocketIOClient {
mutURL = mutURL["https://"] ~= "" mutURL = mutURL["https://"] ~= ""
self.socketURL = mutURL self.socketURL = mutURL
self.reconnectAttempts = -1
// Set options // Set options
if opts != nil { if opts != nil {
@ -129,6 +132,9 @@ class SocketIOClient {
self.connected = true self.connected = true
self.connecting = false self.connecting = false
self.reconnecting = false self.reconnecting = false
self.currentReconnectAttempt = 0
self.reconnectTimer?.invalidate()
self.reconnectTimer = nil
self.handleEvent("connect", data: nil, isInternalMessage: false) self.handleEvent("connect", data: nil, isInternalMessage: false)
} }
@ -764,16 +770,15 @@ class SocketIOClient {
// Something happened while polling // Something happened while polling
func pollingDidFail(err:NSError?) { func pollingDidFail(err:NSError?) {
if !self.reconnecting { if !self.reconnecting {
self.connected = false
self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true) self.handleEvent("reconnect", data: err?.localizedDescription, isInternalMessage: true)
self.tryReconnect(triesLeft: self.reconnectAttempts) self.tryReconnect()
} }
} }
// We lost connection and should attempt to reestablish // We lost connection and should attempt to reestablish
func tryReconnect(var #triesLeft:Int) { @objc func tryReconnect() {
self.connected = false if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts {
if triesLeft != -1 && triesLeft <= 0 {
self.didForceClose() self.didForceClose()
return return
} else if self.connected { } else if self.connected {
@ -782,26 +787,25 @@ class SocketIOClient {
return return
} }
// println("Trying to reconnect #\(reconnectAttempts - triesLeft)") if self.reconnectTimer == nil {
self.handleEvent("reconnectAttempt", data: triesLeft - 1, isInternalMessage: true) self.reconnecting = true
dispatch_async(dispatch_get_main_queue()) {[weak self] in
if self == nil {
return
}
let waitTime = UInt64(self.reconnectWait) * NSEC_PER_SEC self?.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(self!.reconnectWait),
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(waitTime)) target: self!, selector: "tryReconnect", userInfo: nil, repeats: true)
// Wait reconnectWait seconds and then check if connected. Repeat if not
dispatch_after(time, dispatch_get_main_queue()) {[weak self] in
if self == nil || self!.connected || self!.closed {
return return
} }
if triesLeft != -1 { return
triesLeft = triesLeft - 1
}
self!.tryReconnect(triesLeft: triesLeft)
} }
self.reconnecting = true
self.handleEvent("reconnectAttempt", data: self.reconnectAttempts - self.currentReconnectAttempt,
isInternalMessage: true)
self.currentReconnectAttempt++
if self.paramConnect { if self.paramConnect {
self.connectWithParams(self.params) self.connectWithParams(self.params)
} else { } else {
@ -817,7 +821,7 @@ class SocketIOClient {
self.didForceClose() self.didForceClose()
} else { } else {
self.handleEvent("reconnect", data: reason, isInternalMessage: true) self.handleEvent("reconnect", data: reason, isInternalMessage: true)
self.tryReconnect(triesLeft: self.reconnectAttempts) self.tryReconnect()
} }
} }
@ -830,7 +834,7 @@ class SocketIOClient {
self.didForceClose() self.didForceClose()
} else if !self.reconnecting { } else if !self.reconnecting {
self.handleEvent("reconnect", data: error.localizedDescription, isInternalMessage: true) self.handleEvent("reconnect", data: error.localizedDescription, isInternalMessage: true)
self.tryReconnect(triesLeft: self.reconnectAttempts) self.tryReconnect()
} }
} }
} }