2015-11-03 49 views
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)'不會觸發任何UI更新? 'viewController.myProperty = true'沒有副作用。這只是一個簡單的屬性。 – ma11hew28

回答

1

這取決於實例變量實際在做什麼。一般規則是由後臺線程運行的代碼不應觸發任何UI更新,如view.addSubview(..)view.setNeedsLayout等,那麼使用後臺線程使用視圖控制器是安全的。

另一個例子是導航控制器。例如,一旦視圖控制器被推到導航堆棧上,即使更新viewController.title也可能是危險的,因此您應該確保viewController.myProperty = true不會觸發任何UI更新。就個人而言,我會做如下分配在主線程中感到安全:

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

長話短說,但是,您可以初始化在後臺線程新的UIView或UIViewController中(或任何UIResponder),你應該改變任何其屬性在主線程中觸發UI更新。所以在後臺創建,但在主線程中更新。

+0

我認爲處理主隊列上的一些屬性不足以繞過這裏的問題。單獨將視圖控制器推送到導航堆棧是在主隊列上應該做的事情;而所有的視圖控制器生命週期方法將被調用(並且也是'viewsubviews'等視圖控制器視圖對象的東西)。總而言之,這是不安全的! – antonio

+0

@antonio我認爲你在理解你正在閱讀的內容時有問題。我們基本上是說同樣的事情。在任何線程中初始化視圖控制器是完全安全的,但是一旦UI更新開始發揮作用,您必須始終在主隊列上執行此操作。創建一個視圖控制器不會觸發任何關於其生命週期的方法,比如'viewDidLoad','viewWillAppear'或'viewDidLayoutSubviews'。 – ozgur

+0

我不是在說創造;我談論推動導航堆棧。 – antonio

相關問題