启动应用后如何重新加载tableview,如果每次都有新内容出现在数组中,并且如果数组相同,则不需要重新加载

时间:2018-10-11 11:19:24

标签: ios swift tableview

我的问题:启动应用后,我只想重新加载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)
    }

}

2 个答案:

答案 0 :(得分:0)

一个非常简单的解决方案是只声明另一个变量以进行比较,因此最初,您的临时数组将为空,而实际数组将包含一些元素,因此,您只比较两个数组,如果两个都相同,则不要不需要做任何事情,但是如果两者都不相同,则只需重新加载您的表视图并更新临时数组,这样对于下次进行比较也将有所帮助。请确保在重新加载tableview后更新临时数组。

希望这会对您有所帮助。

答案 1 :(得分:0)

通常,重新加载表视图应被视为一种廉价操作,如果重新加载表视图时遇到一些延迟/无响应,则首先要注意的是:

  1. 是否在每次需要TableViewCell时将它们从队列中分离出来而不是创建?如果没有,则使缓存的单元出队。

  2. tableView(cellForRowAt:IndexPath)内部是否发生了一些昂贵的操作?如果是这样,请考虑使其更快。

  3. 您是否在主线程上解析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()
        }
    }

}

注意:您真正要做的而不是使用NSArrayNSDictionary而是使用自定义结构解析HTTP响应, Decodable协议。然后,可以使响应对象Equatable的数组元素变小,然后使实现isEqual变得简单。