viewWillAppear是生命周期中从Web服务导入数据的最佳位置吗?这涉及一个小型汇率应用程序。
在viewwillappear的tableview中,我们转到http://api.fixer.io更新一个名为rates的数组,以及一个RatesData类中返回的所有数据。如果Internet连接失败,我们要么使用我们已有的数据,要么查看手机文件系统上的文件。
导入数据所需的时间意味着我在填充数据数组之前运行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()
}
}
}
答案 0 :(得分:2)
viewWillAppear
就可以了。 viewWillAppear
的示例。如果您希望仅在viewDidLoad
viewWillAppear
- 每次出现视图时都会调用viewDidLoad
- 在视图首次加载时调用一次