diff --git a/Example/SwiftCentrifuge/Base.lproj/Main.storyboard b/Example/SwiftCentrifuge/Base.lproj/Main.storyboard index bf1e7f6..e9becf2 100644 --- a/Example/SwiftCentrifuge/Base.lproj/Main.storyboard +++ b/Example/SwiftCentrifuge/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -17,7 +17,7 @@ - + @@ -63,7 +63,7 @@ - + + + + + + + + + @@ -96,15 +113,13 @@ - + - - @@ -112,6 +127,7 @@ + diff --git a/Example/SwiftCentrifuge/ViewController.swift b/Example/SwiftCentrifuge/ViewController.swift index d7025e3..13b8cc4 100644 --- a/Example/SwiftCentrifuge/ViewController.swift +++ b/Example/SwiftCentrifuge/ViewController.swift @@ -15,12 +15,16 @@ class ViewController: UIViewController { @IBOutlet weak var lastMessage: UILabel! @IBOutlet weak var newMessage: UITextField! @IBOutlet weak var connectButton: UIButton! - + @IBOutlet weak var resetReconnectStateButton: UIButton! + private var client: CentrifugeClient? private var sub: CentrifugeSubscription? override func viewDidLoad() { super.viewDidLoad() + + resetReconnectStateButton.isHidden = true + NotificationCenter.default.addObserver(self, selector: #selector(self.disconnectClient(_:)), name: UIApplication.willResignActiveNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.connectClient(_:)), name: UIApplication.didBecomeActiveNotification, object: nil) @@ -88,6 +92,10 @@ class ViewController: UIViewController { } } } + + @IBAction func resetReconnectState(_ sender: Any) { + self.client?.resetReconnectState() + } } extension ViewController: CentrifugeConnectionTokenGetter { @@ -102,6 +110,7 @@ extension ViewController: CentrifugeClientDelegate { DispatchQueue.main.async { [weak self] in self?.clientState.text = "Connected" self?.connectButton.setTitle("Disconnect", for: .normal) + self?.resetReconnectStateButton.isHidden = true } } @@ -110,6 +119,7 @@ extension ViewController: CentrifugeClientDelegate { DispatchQueue.main.async { [weak self] in self?.clientState.text = "Disconnected" self?.connectButton.setTitle("Connect", for: .normal) + self?.resetReconnectStateButton.isHidden = true } } @@ -118,6 +128,7 @@ extension ViewController: CentrifugeClientDelegate { DispatchQueue.main.async { [weak self] in self?.clientState.text = "Connecting" self?.connectButton.setTitle("Disconnect", for: .normal) + self?.resetReconnectStateButton.isHidden = false } } diff --git a/Sources/SwiftCentrifuge/Client.swift b/Sources/SwiftCentrifuge/Client.swift index d76e855..d130945 100644 --- a/Sources/SwiftCentrifuge/Client.swift +++ b/Sources/SwiftCentrifuge/Client.swift @@ -206,6 +206,20 @@ public class CentrifugeClient { } } + /** + Clears the reconnect state, resetting attempts and delays. + Schedules a reconnect immediately if one was pending. + */ + public func resetReconnectState() { + self.syncQueue.async { [weak self] in + guard let strongSelf = self else { return } + strongSelf.reconnectAttempts = 0 + + guard strongSelf.reconnectTask != nil else { return } + strongSelf.scheduleReconnect(immediately: true) + } + } + /** setToken allows updating connection token. - parameter token: String @@ -733,12 +747,12 @@ fileprivate extension CentrifugeClient { } } - private func scheduleReconnect() { + private func scheduleReconnect(immediately: Bool = false) { assertIsOnQueue(syncQueue) guard self.state == .connecting else { return } - let delay = self.getBackoffDelay( + let delay = immediately ? 0.0 : self.getBackoffDelay( step: self.reconnectAttempts, minDelay: self.config.minReconnectDelay, maxDelay: self.config.maxReconnectDelay