diff --git a/ActionCableClient.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ActionCableClient.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ActionCableClient.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Source/Classes/ActionCableClient.swift b/Source/Classes/ActionCableClient.swift index 19e1822..2d27ca7 100644 --- a/Source/Classes/ActionCableClient.swift +++ b/Source/Classes/ActionCableClient.swift @@ -29,6 +29,7 @@ open class ActionCableClient { //MARK: Socket fileprivate(set) var socket : WebSocket + fileprivate let queue = DispatchQueue(label: "Custom_Queue") /// Reconnection Strategy /// @@ -419,6 +420,8 @@ extension ActionCableClient { } fileprivate func onMessage(_ message: Message) { + + queue.sync { switch(message.messageType) { case .unrecognized: break @@ -429,15 +432,22 @@ extension ActionCableClient { DispatchQueue.main.async(execute: callback) } case .message: + if let channel = channels[message.channelName!] { // Notify Channel channel.onMessage(message) if let callback = onChannelReceive { - DispatchQueue.main.async(execute: { callback(channel, message.data, message.error) } ) + DispatchQueue.main.async(execute: { [weak self] in + guard let weakSelf = self else { return } + if weakSelf.onChannelReceive != nil { + callback(channel, message.data, message.error) + } + } ) } } case .confirmSubscription: + if let channel = unconfirmedChannels.removeValue(forKey: message.channelName!) { self.channels.updateValue(channel, forKey: channel.uid) @@ -448,6 +458,7 @@ extension ActionCableClient { DispatchQueue.main.async(execute: { callback(channel) }) } } + case .rejectSubscription: // Remove this channel from the list of unconfirmed subscriptions if let channel = unconfirmedChannels.removeValue(forKey: message.channelName!) { @@ -460,13 +471,13 @@ extension ActionCableClient { } } case .hibernateSubscription: - if let channel = channels.removeValue(forKey: message.channelName!) { - // Add channel into unconfirmed channels - unconfirmedChannels[channel.uid] = channel - - // We want to treat this like an unsubscribe. - fallthrough - } + if let channel = channels.removeValue(forKey: message.channelName!) { + // Add channel into unconfirmed channels + unconfirmedChannels[channel.uid] = channel + + // We want to treat this like an unsubscribe. + fallthrough + } case .cancelSubscription: if let channel = channels.removeValue(forKey: message.channelName!) { @@ -478,6 +489,7 @@ extension ActionCableClient { } } } + } } fileprivate func onData(_ data: Data) {