我正在编写一个代码,我需要在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个消息,而在处理以前的消息时再次200消息,CPU消耗显示为120,UI被冻结。
提前致谢。
答案 0 :(得分:0)
嗯,有&#39;直播&#39;和&#39;生活&#39; :) 这是我们正在讨论的手机,所以每隔0.025秒更新一次屏幕是没用的...你可以轻松减慢你的获取时间,但让我们一次只能解决一个问题:
1 /不要使用tableView.scrollToRow,而是使用&#39; insertRows(在indexPaths:[IndexPath],使用动画:UITableViewRowAnimation)&#39;插入一个新行,这样一来,如果你的用户正在阅读,那么,如果添加200个新项目,他不会被打扰 https://developer.apple.com/documentation/uikit/uitableview/1614879-insertrows
2 /减慢你的UI更新,你过度使用你的主线程......如果你愿意,你可以每25ms获取一次,但我建议只有在你获得新内容时才使用限制机制更新UI,并且只有当最后一次UI更新不到5秒前。