什么时候启动/加载UIViewController元素(通过Main.storyboard中的IB创建)?

时间:2016-03-23 05:58:09

标签: ios swift multithreading interface-builder instruments

在我的viewController中,我在Main.storyboard中通过Interface Builder创建了大约15个按钮,我以编程方式创建了其余的按钮。为了避免延迟,我将大部分内容发送到后台线程,但所有UI内容,包括15个按钮,并不是因为它们不是线程安全的。我想知道这些15个按钮到底是什么时候加载的。是在viewDidLoad之前,在viewDidLoadviewDidAppear之间吗?此外,由于我仍然有一些延迟和屏幕冻结,我试图在一个方法中初始化这个UIViewController的大部分内容,并在AppDelegate中调用此方法,以便我将耗时的任务移动到应用程序启动时(并且似乎真的如此)为了提高性能和打印语句真的显示大多数繁重的代码都是在应用程序启动时调用,而不是在我呈现视图控制器时。

然而,每次我第一次得到这个viewController时,仍然会有一个初始的重载。当我回到rootViewController并再次返回到此ViewController(通过rootViewController上的presentViewController(viewController, animated: false, completion:nil和ViewController上的self.dismissViewController(animated:false, completion:nil))时,我访问它的所有后续时间都没有冻结(这是我所有痛苦的根源......我不明白为什么我第一次访问ViewController只花时间,而不是在第一次访问后的所有其他时间,即使所有{{1除了必需的超类之外没有代码。

所以,所有这些让我质疑这个初始的重载是否可能来自通过Interface Builder创建的元素。这是我能想到解释这种行为的唯一可能原因。这里的仪器屏幕截图显示了第一次访问viewController时出现负载很重的行为,而且每次我访问它时,只有微小的窥视根本不影响UI(这是我想要的)时间。
   Instruments Sample Screenshot

1 个答案:

答案 0 :(得分:1)

initWithNibName:bundle 将在加载nib之前被调用。它是发送到视图(或窗口)控制器以创建控制器的消息

从故事板(仅故事板)加载期间将调用

initWithCoder 。这是发送到存档中每个对象的消息,以便取消归档。

在加载nib之后将调用

awakeFromNib 。它是在连接所有插座后,在笔尖中的所有对象完全加载后发送到笔尖中每个对象的消息那个笔尖的连接。