viewWillAppear来自webservices的更新表中的延迟

时间:2017-05-10 01:09:42

标签: ios swift multithreading web-services

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()
        }
    }
}

1 个答案:

答案 0 :(得分:2)

    只要获取异步
  • viewWillAppear就可以了。
  • 请记住,每次出现视图时都会触发它。当此视图控制器被另一个模态视图控制器隐藏并且模式视图控制器被关闭时,将调用viewWillAppear的示例。如果您希望仅在viewDidLoad
  • 中调用它时才能调用它

摘要

  • viewWillAppear - 每次出现视图时都会调用
  • viewDidLoad - 在视图首次加载时调用一次
  • 选择符合您需求的产品。