2017-08-04 37 views
0
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 /斯威夫特不知道上面级,iOS的 - 当全球计算发生UIViewControllers

  1. FoodUtils.getFoodList()是在运行时准备?
  2. 有什么好的做法?在viewDidLoad中还是在类范围内准备列表?对于这两种情况,UIViewController的哪个生命周期将在运行时影响内存?
+0

'FoodUtils.getFruitList()'调用一些网址或数据库请求? –

+0

@AdrianBobrowski让它调用一些数据库操作。 –

+0

更好的做法是创建你的'viewDidLoad'列表尤其是如果它是一个数据库操作 –

回答

3

在代码(对象初始化):

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

创建视图控制器例如当昂贵的操作被执行。

在代码(viewDidLoad中内侧)

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

昂贵的操作被执行一次的界面元素(IB出口)已钩住与ViewController中,和意见已被加载。

实际上它没有什么不同,因为viewDidLoad是在类初始化后执行的。当使用SEGUES时(对于编程式显示的VC,最后读取注释)。

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

或者,你能做到这一点在viewDidAppear方法,并开始显示活动指示器视图控制器,那么当昂贵的操作完成后,隐藏的活动指示器和加载数据。

由于事实上,第二种方法使用非常普遍,特别是显示数据的大名单时。当使用以旋转指示器开始的应用程序时,您一定看过它,直到数据准备好显示。


注:

如果你是显示编程的视图控制器,当你“从笔尖负荷”使用可以分开的2种功能的定时,因为第一个被执行的方法。一旦你真正尝试访问其中的任何视图,就会执行第二个视图。


注2:

昂贵的网络操作应使用户界面不会被阻止始终在后台线程执行。这就是为什么人们经常在后台检索信息时显示活动指标。

+0

感谢您的详细解释。它有助于。 –