From 13209094085f02b47c7e8dcd6eec20d9e4ec427b Mon Sep 17 00:00:00 2001 From: Joe Szymanski Date: Fri, 8 Dec 2017 11:12:20 -0500 Subject: [PATCH] Don't attempt to reconnect if a connection is already in progress --- Sources/ParseLiveQuery/Client.swift | 4 ++++ Sources/ParseLiveQuery/Internal/ClientPrivate.swift | 3 +++ 2 files changed, 7 insertions(+) diff --git a/Sources/ParseLiveQuery/Client.swift b/Sources/ParseLiveQuery/Client.swift index c46c4eb1..5ffa0b92 100644 --- a/Sources/ParseLiveQuery/Client.swift +++ b/Sources/ParseLiveQuery/Client.swift @@ -25,6 +25,7 @@ open class Client: NSObject { var socket: WebSocket? public var shouldPrintWebSocketLog = true public var userDisconnected = false + var isConnecting = false // This allows us to easily plug in another request ID generation scheme, or more easily change the request id type // if needed (technically this could be a string). @@ -222,12 +223,14 @@ extension Client { you use the client, and should usually only be called when an error occurs. */ public func reconnect() { + guard socket == nil || !isConnecting else { return } socket?.disconnect() socket = { let socket = WebSocket(url: host) socket.delegate = self socket.callbackQueue = queue socket.connect() + isConnecting = true userDisconnected = false return socket }() @@ -240,6 +243,7 @@ extension Client { Use this if you wish to dispose of the live query client. */ public func disconnect() { + isConnecting = false guard let socket = socket else { return diff --git a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift index d19781e6..9233f64a 100644 --- a/Sources/ParseLiveQuery/Internal/ClientPrivate.swift +++ b/Sources/ParseLiveQuery/Internal/ClientPrivate.swift @@ -129,11 +129,13 @@ extension Client: WebSocketDelegate { } public func websocketDidConnect(socket: WebSocket) { + isConnecting = false let sessionToken = PFUser.current()?.sessionToken ?? "" _ = self.sendOperationAsync(.connect(applicationId: applicationId, sessionToken: sessionToken, clientKey: clientKey)) } public func websocketDidDisconnect(socket: WebSocket, error: NSError?) { + isConnecting = false if shouldPrintWebSocketLog { print("error: \(String(describing: error))") } // TODO: Better retry logic, unless `disconnect()` was explicitly called @@ -143,6 +145,7 @@ extension Client: WebSocketDelegate { } public func webSocket(_ webSocket: WebSocket, didCloseWithCode code: Int, reason: String?, wasClean: Bool) { + isConnecting = false if shouldPrintWebSocketLog { print("code: \(code) reason: \(String(describing: reason))") } // TODO: Better retry logic, unless `disconnect()` was explicitly called