我正在处理一个代码,在该代码中,我需要在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秒。