iOS - 当全局计算发生UIViewControllers时

时间:2017-08-04 04:24:35

标签: ios swift uiviewcontroller

class HealthViewController: UIViewController {

    var foods: [Food] = FoodUtils.getFoodList() // some expensive operations
    var fruits: [Fruit];

    override func viewDidLoad() {
        super.viewDidLoad()

        self.fruits = FoodUtils.getFruitList() // some expensive operations
    }
}

我想知道iOS / Swift中的上课,

  1. 在运行时准备FoodUtils.getFoodList()
  2. 什么是好习惯?在viewDidLoad或类范围内准备列表?在这两种情况下,UIViewController的哪个生命周期会影响运行时的内存?

1 个答案:

答案 0 :(得分:3)

在代码(对象初始化)中:

var foods: [Food] = FoodUtils.getFoodList() // some expensive operations

在创建视图控制器实例时执行昂贵的操作。

代码中的

(在viewDidLoad中):

self.fruits = FoodUtils.getFruitList() // some expensive operations

一旦界面元素(IB出口)与视图控制器挂钩,就会执行昂贵的操作,并且视图已被加载。

在实践中它并没有什么不同,因为在使用SEGUES后对类进行初始化后执行viewDidLoad(对于以编程方式显示的VC,最后读取注释)。

如果您正在谈论可能需要几秒钟的操作,那么最好的做法是,在显示繁忙视图(带有活动指示器的视图)时显示视图控制器之前执行昂贵的操作。

或者,您可以在viewDidAppear方法中执行此操作,并启动带有活动指示器的View控制器,然后在昂贵的操作完成后,隐藏活动指示器并加载数据。

事实上,第二种方法非常常用,尤其是在显示大量数据时。在使用以旋转指示符开头的应用程序之前,您必须已经看到它,直到数据准备好显示为止。

注意:

如果以编程方式显示视图控制器,则可以分离2个函数的时序,因为第一个是在使用"从nib加载时执行的。方法。虽然第二个是在您实际尝试访问其中的任何视图时执行的。

注2:

应始终在后台线程上执行昂贵的网络操作,以便不阻止UI。这就是人们在后台检索信息时经常显示活动指标的原因。