ios - UIViewController 元素(通过 IB 在 Main.storyboard 中创建)究竟何时启动/加载?

标签 ios swift multithreading interface-builder instruments

在我的 viewController 中,我有大约 15 个按钮是通过 Main.storyboard 中的 Interface Builder 创建的,其余按钮是我以编程方式创建的。为了避免延迟,我将大部分内容发送到后台线程,但所有 UI 内容,包括 15 个按钮,都不是,因为它们不是线程安全的。我想知道这 15 个按钮究竟是什么时候加载的。是在viewDidLoad之前,在viewDidLoadviewDidAppear之间,等等?此外,由于我仍然有一些延迟和屏幕卡住,我尝试在一个方法中初始化这个 UIViewController 的大部分内容,并在 AppDelegate 中调用这个方法,这样我就可以将耗时的任务转移到应用程序启动时(而且看起来确实如此为了提高性能,打印语句确实显示大部分繁重的代码是在应用程序启动时调用的,而不是在我呈现 View Controller 时调用的)。

但是,每次第一次拿到这个viewController,还是有一个初始的重载。当我回到 rootViewController 并再次回到这个 ViewController(通过 rootViewController 上的 presentViewController(viewController, animated: false, completion:nilself.dismissViewController(animated:false, completion: nil) 在 ViewController 上),我访问它的所有后续时间都不再卡住(这是我所有痛苦的根源......我不明白为什么我第一次只需要时间访问 ViewController 而不是在我第一次访问它之后的所有其他时间,即使所有 viewDidLoad, viewWillAppear, viewDidAppear 除了需要的父类(super class)之外没有代码)。

因此,所有这一切让我怀疑这种初始的繁重负载是否可能来自通过 Interface Builder 创建的元素。这是我能想到的解释这种行为的唯一可能原因。这是 Instruments 屏幕截图,显示了我第一次访问 viewController 时负载很重的行为,而每次我在上述第一个之后访问它时,只有一点点不影响 UI 的行为(这是我想要的)时间。
Instruments Sample Screenshot

最佳答案

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

initWithCoder 将在从 Storyboard(仅 Storyboard)加载期间被调用。这是一条消息,发送到存档中的每个对象以取消存档。

awakeFromNib 将在 nib 加载后调用。它是在 nib 中的所有对象都已完全加载后,连接所有 outlet 后发送给 nib 中的每个对象的消息该 Nib 中的连接。

关于ios - UIViewController 元素(通过 IB 在 Main.storyboard 中创建)究竟何时启动/加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36170819/

相关文章:

ios - WkWebView如何管理输入类型文件启动的事件和窗口

swift - animateWithDuration 未显示

multithreading - OpenMP 了解关键构造中的死锁

ios - 如何仅使用代码创建 UIImageView?

iphone - 当表格离开然后返回时,UITableView 单元格消失

html - 使用 CSS 更改 Safari IOS 上的地址栏背景颜色

python - 如何停止Python中的套接字线程?

ios - UIView.transition 延迟

php - 如何正确地将图片加载到 UITableVIew 中

asp.net - ASP.NET HttpModules 中的线程安全缓存