Reputation: 126319
Related: Is it ok to create a UIView on a background thread?
Is this background-thread code safe?
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)
})
Upvotes: 7
Views: 3193
Reputation: 1532
It seems that @ozgur answer is out of date now. If you try and create a UIViewController from a background thread in the latest version of Xcode (Version 11.5 at the time of writing) then you will get the following error:
-[UIViewController init] must be used from main thread only
Upvotes: 3
Reputation: 52093
It depends on what the instance variables are actually doing. General rule is that the code running by a background thread should not trigger any UI updates such as view.addSubview(..)
or view.setNeedsLayout
etc, then it is safe to play around with a view controller using a background thread.
Another example would be navigation controllers. For instance, once a view controller was pushed onto a navigation stack, even updating viewController.title
can be dangerous so you should make sure viewController.myProperty = true
doesn't trigger any UI updates. Personally, I would do the following assignments in the main thread to feel safe:
dispatch_async(dispatch_get_main_queue(), {
viewController.title = "My Title"
viewController.myProperty = true
...
})
Long story short, you can initialize new UIView or UIViewController (or any UIResponder) in a background thread however, you should be changing any of its properties triggering UI updates within main thread. So create in background but update in main thread.
Upvotes: 2