Ios VIEW将在webservices的更新表中延迟显示

Ios VIEW将在webservices的更新表中延迟显示,ios,swift,multithreading,web-services,Ios,Swift,Multithreading,Web Services,ViewWillDisplay是否是生命周期中从Web服务导入数据的最佳位置?这与一个小型汇率应用程序有关 在ViewWillDisplay的tableview中,我们转到更新名为rates的数组,以及类RatesData中所有返回的数据。如果互联网连接失败,我们要么使用我们已有的数据,要么查看电话文件系统中的文件 导入数据所需的时间意味着我在填充数据数组之前运行cellForRowAt indexPath;这意味着数据在被汇率更新之前,会在可感知的延迟(我有默认的单元格要加载)之后出现 下一步

ViewWillDisplay是否是生命周期中从Web服务导入数据的最佳位置?这与一个小型汇率应用程序有关

在ViewWillDisplay的tableview中,我们转到更新名为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()
        }
    }
}
  • 视图将出现
    只要获取是异步就可以了
  • 请记住,每次视图出现时,它都会被触发。示例:当此视图控制器被另一个模态视图控制器隐藏且模态视图控制器被解除时,
    视图将出现
    。如果希望只调用一次,可以在
    viewDidLoad
总结
  • 视图将出现
    -每次显示视图时调用
  • viewDidLoad
    -在视图首次加载时调用一次
  • 选择符合你需要的
      • 视图将出现
        只要获取是异步就可以了
      • 请记住,每次视图出现时,它都会被触发。示例:当此视图控制器被另一个模态视图控制器隐藏且模态视图控制器被解除时,
        视图将出现
        。如果希望只调用一次,可以在
        viewDidLoad
      总结
      • 视图将出现
        -每次显示视图时调用
      • viewDidLoad
        -在视图首次加载时调用一次
      • 选择符合你需要的

      不要忘记调用
      super.viewwillbeen(动画)
      。不要忘记调用
      super.viewwillbeen(动画)