我的问题:启动应用后,我只想重新加载tableview
数据一次,但是每次出现tableview时它都会重新加载,并且如果数组相同,则不需要重新加载一遍又一遍
func onHttpSuccess(data: NSDictionary, RID: Int) {
DispatchQueue.main.async {
self.progressHUD.hide(animated: true)
}
if data.value(forKey: "status") as! Bool {
if (RID == 1)
{
if ((data.value(forKey: "data") as? NSArray)?.count) != nil
{
self.userData = (data.value(forKey: "data") as? NSArray)!
UserDefaults.standard.set(self.userData, forKey: Constants.catDATA)
print(self.userData)
if self.userData.count > 0
{
DispatchQueue.main.async
{
self.tableView.isHidden = false
self.tableView.reloadData()
}
}
}
}
}
else
{
Utility.sharedInstance.showAlertView(message: (data.value(forKey: "message") as? String)!, controllerObj: self)
}
}
答案 0 :(得分:0)
一个非常简单的解决方案是只声明另一个变量以进行比较,因此最初,您的临时数组将为空,而实际数组将包含一些元素,因此,您只比较两个数组,如果两个都相同,则不要不需要做任何事情,但是如果两者都不相同,则只需重新加载您的表视图并更新临时数组,这样对于下次进行比较也将有所帮助。请确保在重新加载tableview后更新临时数组。
希望这会对您有所帮助。
答案 1 :(得分:0)
通常,重新加载表视图应被视为一种廉价操作,如果重新加载表视图时遇到一些延迟/无响应,则首先要注意的是:
是否在每次需要TableViewCell时将它们从队列中分离出来而不是创建?如果没有,则使缓存的单元出队。
tableView(cellForRowAt:IndexPath)
内部是否发生了一些昂贵的操作?如果是这样,请考虑使其更快。
您是否在主线程上解析HTTP响应?如果是这样,那可能是造成延迟的原因,而不是重新加载表格视图本身,因此可以将其移至后台,就可以了。
如果这些问题都不存在,并且由于重新加载表视图而导致UI性能仍然很差,那么您可以通过比较检索到的新数据集来完成您所要解决的问题从HTTP响应到现有表视图数据,然后再决定重新加载。最简单的方法是将局部变量保留为表视图控制器的一部分,并在HTTP请求中对此进行检查:
class MyTableViewController : UITableViewController {
var tableViewData: NSArray
func isEqual(_ oldData: NSArray, newData: NSArray) -> Bool {
// check that all the records in the array are equal
}
// call this from inside the onHttpSuccess method in place of self.tableView.reloadData()
func reloadIfNeccecary(newData: NSArray) {
if !isEqual(tableViewData, newData) {
self.tableView.reloadData()
}
}
}
注意:您真正要做的而不是使用NSArray
和NSDictionary
而是使用自定义结构解析HTTP响应, Decodable
协议。然后,可以使响应对象Equatable
的数组元素变小,然后使实现isEqual
变得简单。