处理iOS

时间:2018-03-30 11:59:44

标签: ios swift uitableview socket.io

我正在编写一个代码,我需要在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被冻结。

提前致谢。

1 个答案:

答案 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秒前。