viewWillAppear是生命周期中从Web服务导入数据的最佳位置吗?这与一个小汇率应用程序有关。
在 viewwilllook 的表视图中,我们转到 http://api.fixer.io 更新一个名为 rates 的数组,以及类 RatesData 中的所有返回数据。如果互联网连接失败,我们要么使用已有的数据,要么查看电话文件系统上的文件。
导入数据所需的时间意味着我在填充数据数组之前运行cellForRowAt indexPath;这意味着数据在可感知的延迟(我有默认单元格要加载(之后出现,然后使用汇率进行更新。
接下来我将实现coredata作为更好的解决方案,但是第一次运行应用程序时,我们仍然会得到这种不希望的效果。
override func viewWillAppear(_ animated: Bool) {
searchForRates()
importCountriessync()
}
private func searchForRates(){
Request.fetchRates(withurl: APIConstants.eurURL) {[weak self] (newData:RatesData, error:Error?)->Void in
DispatchQueue.main.async {
//update table on the main queue
//returns array of rates
guard (error == nil) else {
print ("did not recieve data - getting from file if not already existing")
if ( self?.rates == nil)
{
self?.searchForFileRates()
}
return
}
self?.rates = newData.rates
let newData = RatesData(base: newData.base, date: Date(), rates: newData.rates)
self?.ratesFullData = newData
self?.tableView.reloadData()
}
}
}
func searchForFileRates(){
print ("file rates")
Request.fetchRates(withfile: "latest.json") { [weak self] (newData: RatesData)->Void in
DispatchQueue.main.async {
//update table on the main queue
//returns array of rates
self?.rates = newData.rates
let newData = RatesData(base: newData.base, date: Date(), rates: newData.rates)
self?.ratesFullData = newData
self?.tableView.reloadData()
}
}
}
- 是
- 的,只要获取是异步的
viewWillAppear
就可以了。 - 请记住,每次视图出现时都会触发它。示例,当此视图控制器被另一个模态视图控制器隐藏并且模态视图控制器被解除时,将调用
viewWillAppear
。如果希望它只调用一次,则可以在viewDidLoad
中调用它
总结
-
viewWillAppear
- 每次显示视图时调用 -
viewDidLoad
- 在视图首次加载时调用一次 - 选择满足您需求的产品。