通知被延迟了吗?

时间:2018-07-26 14:53:44

标签: swift notifications tableview datasource delay

今天我遇到了通知被延迟的情况。


如果我将新项目添加到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)
    }

}

1 个答案:

答案 0 :(得分:1)

使用DispatchQueue.main.async很可能是问题所在。这将添加一个在主运行循环的下一个迭代中运行的闭包。如果在runloop迭代之间触发了两个通知,则多个块将排队并运行,从而引起问题。

有几个可行的选择

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