3

Относно: Is it ok to create a UIView on a background thread?Можно ли создать UIViewController в фоновом потоке?

Является ли этот код-нить безопасным?

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) 
}) 
+0

Спасибо! :-) Итак, 'MyViewController (nibName: nil, bundle: nil)' не запускает никаких обновлений пользовательского интерфейса? 'viewController.myProperty = true' не имеет побочных эффектов. Это просто свойство. – ma11hew28

ответ

1

Это зависит от того, что на самом деле производят переменные экземпляра. Общее правило заключается в том, что код, выполняемый фоновым потоком, не должен запускать какие-либо обновления пользовательского интерфейса, такие как view.addSubview(..) или view.setNeedsLayout и т. Д., Тогда можно безопасно играть с контроллером вида с использованием фонового потока.

Другим примером могут быть навигационные контроллеры. Например, после того, как контроллер представления был помещен в стек навигации, даже обновление viewController.title может быть опасным, поэтому вы должны убедиться, что viewController.myProperty = true не запускает никаких обновлений пользовательского интерфейса. Лично я хотел бы сделать следующие задания в главном потоке, чтобы чувствовать себя в безопасности:

dispatch_async(dispatch_get_main_queue(), { 
    viewController.title = "My Title" 
    viewController.myProperty = true 
    ... 
}) 

Короче говоря, вы можете инициализировать новый UIView или UIViewController (или любой UIResponder) в фоновом потоке, однако, вы должны быть изменения каких-либо его свойств, запускающих обновления пользовательского интерфейса в основном потоке. Так создайте в фоновом режиме, но обновите в основном потоке.

+0

Я считаю, что обработка некоторых свойств в главной очереди будет недостаточной для того, чтобы обойти проблемы здесь. Одно нажатие контроллера представления в стек навигационной системы - это то, что должно быть сделано в основной очереди; в то время как будут задействованы все методы жизненного цикла контроллера представления (а также элементы «layoutsubviews» и т. д. объекта просмотра контроллеров представлений). В целом, это небезопасно! – antonio

+0

@antonio Я думаю, что у вас есть проблема в понимании того, что вы читаете. Мы в основном говорим то же самое. Совершенно безопасно инициализировать контроллер вида в любом потоке, но как только обновления пользовательского интерфейса вступают в игру, вы всегда должны делать это в главной очереди. Создание контроллера представления не вызовет каких-либо методов в отношении его жизненного цикла, например 'viewDidLoad',' viewWillAppear' или 'viewDidLayoutSubviews'. – ozgur

+0

Я не говорю о создании; Я говорю о нажатии в стеке навигации. – antonio

Смежные вопросы