在后台线程上创建 UIViewController 可以吗?

ma1*_*w28 7 thread-safety uiviewcontroller uikit ios background-thread

相关:可以在后台线程上创建 UIView 吗?

这个后台线程代码安全吗?

let viewController = MyViewController(nibName: nil, bundle: nil)
viewController.title = "My Title"
viewController.myProperty = true
dispatch_async(dispatch_get_main_queue(), {
    self.navigationController?.pushViewController(viewController, animated: true)
})
Run Code Online (Sandbox Code Playgroud)

ozg*_*gur 2

这取决于实例变量实际上在做什么。一般规则是,后台线程运行的代码不应触发任何 UI 更新,例如view.addSubview(..)view.setNeedsLayout,然后使用后台线程使用视图控制器是安全的。

另一个例子是导航控制器。例如,一旦视图控制器被推送到导航堆栈上,即使更新也viewController.title可能很危险,因此您应该确保viewController.myProperty = true不会触发任何 UI 更新。就我个人而言,我会在主线程中执行以下分配以确保安全:

dispatch_async(dispatch_get_main_queue(), {
  viewController.title = "My Title"
  viewController.myProperty = true
  ...
})
Run Code Online (Sandbox Code Playgroud)

长话短说,您可以在后台线程中初始化新的 UIView 或 UIViewController (或任何 UIResponder),但是,您应该更改其任何属性以在主线程中触发 UI 更新。因此在后台创建但在主线程中更新。