避免重新加载 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 数据的主要内容,如果未能解决你的问题,请参考以下文章