处理iOS中数千个插座消息



我正在处理一个代码,在该代码中,我需要在tableview和tableview中显示套接字消息,而tableview则使用缓慢的动画来滚动到底部。我处理该操作,但是如果继续从插座上加载消息(请考虑每秒20/30消息(,则UI会冻结。我需要像在实时屏幕上进行一两个迭代中的Facebook一样显示消息。

这是我的代码

override func viewDidLoad() {
        super.viewDidLoad()
        Timer.scheduledTimer(timeInterval: 0.025, target: self, selector: #selector(self.scrollTableView(_:)), userInfo: nil, repeats: true)
        self.designLayout()
    }
@objc func scrollTableView(_ timer: Timer) {
        guard messagesData.count > 0 else {
            return
        }
        if tableView.contentSize.height > tableView.bounds.height {
            tableView.contentInset.top = 0
        }
        tableView.scrollToRow(at: IndexPath(row: messagesData.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: true)
    }
self.socket.on(“key”) {data, ack in
                print("data type is (type(of: data))")
                let arrayValue = data as Array<Any>
                DispatchQueue.global(qos: .background).async {
                    self.handleCountsAndMessaging(data: arrayValue)
                }
            }
func handleCountsAndMessaging(data: Array<Any>) {
  if let arrData = data[0] as? NSMutableDictionary {
     if(arrData.object(forKey: "text") != nil) {
                self.tableDataLoading(str: String(describing: arrData.object(forKey: "text")!))
            }
     }
}
func tableDataLoading() {
    print ("sttttttt (str)")
    DispatchQueue.main.async {
        self.messagesData.add(str)
        self.tableView.reloadData()
    }
}

有时我会从插座上从插座上收到200个邮件,而在处理以前的消息时,CPU消耗如120,UI冻结。

预先感谢。

好吧,有'live'和'live':)这是我们正在谈论的手机,因此每0.025秒更新屏幕是毫无用处的...您可以轻松减慢您的获取时间,但让我们一次解决一个问题:

1/不要使用tableview.scrolltorow,而是" inserstrows(在indexpaths:[indexpath(,使用动画:uitaiteViewRowAnimation('插入新的行,如果您的用户正在阅读,他会这样,他赢了,他赢了'如果您添加200个新项目,请打扰https://developer.apple.com/documentation/uikit/uitableview/1614879-insertrows

2/放慢UI的更新,您过度使用主线程...如果愿意,您可以每25ms获取每25ms,但是我建议仅在获得新内容时使用节流机制来更新UI,并且仅当您获取新内容时,并且只有当上次UI更新不少于5秒。

最新更新