2015-09-08 110 views
0

我知道強烈建議只在主線程中更新UI。否則會導致意外崩潰。從後臺線程執行UI更新,可能的缺陷

但我試過兩種方式,但還沒有遇到任何問題。也許我的場景很簡單,問題只發生在複雜的代碼中,但我想知道更深入的事情。當忽略這一規則時,試圖找到這種情況會導致100%程序性流產或其他嚴重問題(死鎖,競賽狀況等)。

也許你們中的一些人面對這個'敵人',或者記住你的練習中的確切例子。 將非常感謝代碼(或僞代碼)中的可能插圖。

感謝

+0

嘗試運行在後臺線程的動畫爲例:) – KIDdAe

+0

我知道關於應該只在主線程中完成的動畫,但是例如在RESTful場景中,如果在後臺發送請求,而不是獲取數據並且調用'UITableView'上的'reloadData'實例,那麼這些動畫都可以。 – David

回答

1

曾經被線程不安全的,整個的UIKit使呼叫從用來攻擊後臺線程幾乎所有的東西,幾乎都是。現在情況好多了,但是對於GCD來說,無論如何,更新主線程上的用戶界面已經非常簡單。目前的模式是這樣的:

[someWorker runBackgroundOperationAndCall:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update UI 
    }); 
}]; 

這很簡單,我想這不是真的值得第二個想法。當我忘記從主線程更新UI時,它有時可以工作,有時不會 - UI不會立即更新,有一個奇怪的閃爍或類似的東西。有了線程,最好是通過正確的方式來做事情,否則當最不可預料的時候你會進入痛苦的世界。

(很遺憾,我沒有一小片段,將證明事情出錯從後臺線程更新UI時)。