通知延迟?

Notification is delayed?

今天我遇到了通知延迟的问题。


如果我向 tableView 的数据源数组添加一个新项目,并且我使用通知来更新该 tableView(插入行)(因为它在另一个 ViewController 中),

然后,如果我同时执行 2 次,我的应用程序就会崩溃:因为通知迟到了。


更多详情:

我有一个 TabController:

Chat.shared.receiveMessage { message in
                    
    print("1: received msg, added to array")
    ChatStore.shared.messages.append(message)

    print("2: sending noti")
    NotificationCenter.default.post(name: .updateChatMessages, object: nil)

}

还有一个 ChatMessageViewController 收到 .updateChatMessages 通知

@objc func notification_updateChatMessages(){
        
    DispatchQueue.main.async {
            
        print("3: noti arrived")
        self.tableView.beginUpdates()
        self.tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)
        self.tableView.endUpdates()
                
    }
}

问题是,通知以某种方式延迟。

如果同时收到 2 条消息,则会发生以下情况(输出):

1: received msg, added to array

2: sending noti

-

1: received msg, added to array

2: sending noti

-

3: noti arrived

3: noti arrived

应用程序崩溃,因为当第一个通知到达时,两条消息都已添加到数据源中..

相反,输出应如下所示:

1: received msg, added to array

2: sending noti

3: noti arrived

-

1: received msg, added to array

2: sending noti

3: noti arrived

通知是否延迟?我该如何解决?


UPDATE 1: added receiveMessage() to thread as requested

Chat.swift(接收消息的部分)

func receiveMessage(completion: @escaping (String?)->()){
    socket.on("message") {
        (data, socketAck) -> Void in
        guard let dataArray = data[0] as? [String: Any] else {
            return
        }
        guard let message = dataArray["message"] as? String else {
            return
        }
        return completion(message)
    }

}

问题最有可能与使用 DispatchQueue.main.async 有关。这将在 运行 主循环的下一次迭代中添加一个闭包 运行 。如果在 运行 循环迭代之间触发了两个通知,那么多个块将排队并且 运行 导致您看到的问题。

有几个可行的选项

  • 有代码后3: noti arrived看datastore a 计算它应该插入多少行。
  • 让聊天商店以线程安全的方式通知观察者,以便通知始终与商店的内容相匹配。
  • 也许可以使用 DispatchQueue.main.sync。这在很大程度上取决于您接收套接字消息的队列,并可能导致更严重的问题。