From 28fad62ccd37bcb45a6af0b6a620c9cb746f01f0 Mon Sep 17 00:00:00 2001 From: Andy Date: Tue, 2 Oct 2018 13:47:03 +0700 Subject: [PATCH] wrap completion handler to run on handleQueue --- Source/SocketIO/Client/SocketIOClient.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/SocketIO/Client/SocketIOClient.swift b/Source/SocketIO/Client/SocketIOClient.swift index ac7dbff..4e70417 100644 --- a/Source/SocketIO/Client/SocketIOClient.swift +++ b/Source/SocketIO/Client/SocketIOClient.swift @@ -295,8 +295,14 @@ open class SocketIOClient : NSObject, SocketIOClientSpec { } func emit(_ data: [Any], ack: Int? = nil, binary: Bool = true, isAck: Bool = false, completion: (() -> ())? = nil) { + // wrap the completion handler so it always runs async via handlerQueue + let wrappedCompletion = {[weak self, completion] in + guard let this = self else { return } + this.manager?.handleQueue.async { completion?() } + } + guard status == .connected else { - completion?(); + wrappedCompletion(); handleClientEvent(.error, data: ["Tried emitting when not connected"]) return } @@ -306,7 +312,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec { DefaultSocketLogger.Logger.log("Emitting: \(str), Ack: \(isAck)", type: logType) - manager?.engine?.send(str, withData: packet.binary, completion: completion) + manager?.engine?.send(str, withData: packet.binary, completion: completion != nil ? wrappedCompletion : nil) } /// Call when you wish to tell the server that you've received the event for `ack`.