今天我遇到了通知被延迟的情况。
如果我将新项目添加到tableView的dataSource数组中,并且使用通知更新该tableView(插入行)(因为它在另一个ViewController中),则
然后,如果我同时执行两次,则我的应用会崩溃:因为通知迟到了。
更多详细信息:
我有一个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:收到的味精,已添加到数组
2:发送通知
-
1:收到的味精,已添加到数组
2:发送通知
-
3:诺蒂到达了
3:诺蒂到达了
应用程序崩溃,因为当第一个通知到达时,已经将两条消息都添加到了数据源中。
相反,输出应如下所示:
1:收到的味精,已添加到数组
2:发送通知
3:诺蒂到达了
-
1:收到的味精,已添加到数组
2:发送通知
3:诺蒂到达了
通知是否延迟?我该如何解决?
更新1:根据请求向线程添加了receiveMessage()
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)
}
}
答案 0 :(得分:1)
使用DispatchQueue.main.async
很可能是问题所在。这将添加一个在主运行循环的下一个迭代中运行的闭包。如果在runloop迭代之间触发了两个通知,则多个块将排队并运行,从而引起问题。
有几个可行的选择
3: noti arrived
之后查看代码存储区
计算应该插入多少行。DispatchQueue.main.sync
。这高度取决于您正在接收套接字消息的队列,并且可能导致更严重的问题。