避免重新加载 UITableView 数据

Posted

技术标签:

【中文标题】避免重新加载 UITableView 数据【英文标题】:Avoid re-loading UITableView data 【发布时间】:2017-09-15 11:12:46 【问题描述】:

我有一个问题,表格显示一长串演练,当用户离开然后返回时,我希望将其保留在当前滚动位置。

在我的视图控制器中,我的代码可以在视图出现时通过调用 getDrillList(optimize: true) 来加载 UITableView 的数据,getDrillList(optimize: true) 将数据存储在名为 drillListArray 的属性中。

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    getDrillList(optimize: true)

这是加载数据的代码

private func getDrillList(optimize: Bool = false)

    // MAKE API CALL, THE ARRAY IS POPULATED IN THE COMPLETE HANDLER

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    SharedNetworkConnection.apiGetDrillList(apiToken: appDelegate.apiToken, limit: (optimize ? 13 : 0), completionHandler:  data, response, error in
        guard let data = data, error == nil else                                                  // check for fundamental networking error
            print("error=\(error)")
            return
        

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200            // check for http errors
            // 403 on no token
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(response)")

            SharedNetworkConnection.apiLoginWithStoredCredentials(completionHandler:  data, response, error in
                let appDelegate = UIApplication.shared.delegate as! AppDelegate
                let json = try? JSONSerialization.jsonObject(with: data!, options: [])
                if let dictionary = json as? [String: Any] 
                    if let apiToken = dictionary["token"] as? (String) 
                        appDelegate.apiToken = apiToken
                        self.getDrillList()
                    
                
            )
            return
        

        self.drillListParser = DrillListParser(jsonString: String(data: data, encoding: .utf8)!)
        self.drillListArray = (self.drillListParser?.getDrillListArray())!

        DispatchQueue.main.async 
            self.drillTableView.reloadData()
        

        if optimize 
            self.getDrillList()
        
    )

两个问题

首先,如果用户被显示到另一个视图控制器,然后通过Back 返回,我如何检查数据是否已经加载以避免第二次加载?检查数组是否为空是否安全?

其次,这种方法有什么我应该注意的后果吗?

【问题讨论】:

为什么要立即投反对票?请帮我修改我的问题。 我没有投反对票,但很可能是由于您的问题缺乏信息。你展示了一段代码,它本身没有任何意义,并期望人们能够在不知道你实际在做什么的情况下提供帮助。请提供Minimal, Complete and Verifiable example。 将 getDrillList 放入 ViewWillAppear。将解决问题。 @Dávid Pásztor 谢谢,我已经添加了方法调用。我希望他们能给我一个在否决之前进行编辑的机会。似乎不公平。 不要使用 appdelegate 来存储你的值,使用你自定义的单例类来处理所有要存储的值 【参考方案1】:

viewDidLoad() 中添加getDrillList(optimize: true),它将在生命周期中调用一次,或者您可以通过布尔标志检查是否已加载数据。

【讨论】:

谢谢,我试试这个。

以上是关于避免重新加载 UITableView 数据的主要内容,如果未能解决你的问题,请参考以下文章

重新加载 UITableView 数据而不重新加载视图?

iOS:重新加载 UITableView 后滑动显示数据

使用大型数据库时,如何避免 UITableView 中的自定义单元格加载时间过长

Swift UITableView 重新加载数据

解析查询后在哪里重新加载 UITableView 数据

点击按钮时 UITableView 重新加载数据