2015-02-24 70 views
0

以外我有這樣NavigationController.pushViewController崩潰如果運行mainQueue/mainThread

SomeController *controller = [[SomeController alloc] init]; 
[self.navController setViewControllers:@[controller] animated:YES]; 

代碼如果non-main thread運行此代碼,其被執行上面的代碼

期間的viewControllerresignFirstResponder然後應用程序崩潰如果在dispatch_async(dispatch_get_main_queue, ^{})中運行此代碼;

然後它工作正常,沒有崩潰

爲什麼它會崩潰的第一種情況下?我認爲如果在非主線程中運行,那麼UI不會看到更改,但我沒有想到它會崩潰?

回答

1

調用UIKit類應發生在主線程上。蘋果UIKit documentation狀態:

注意

在大多數情況下,使用UIKit類只能從應用程序的主線程。對於從UIResponder派生的類或者以任何方式涉及操縱應用程序用戶界面的類尤其如此。

因爲UIKit假定它將在主線程上運行,所以如果嘗試在不同的線程上訪問它,會發生什麼情況並沒有真正的保證;您的用戶界面可能不會更新,您可能會崩潰等等。如果某些類發現您在非主線程上調用它們,則甚至可能會發生異常。

+0

我懷疑UI代碼對於速度來說大多是無鎖的。如果你能夠從多個線程中調用它,它將不得不添加鎖定,在正常情況下,鎖定會使事情減慢。 – 2015-02-24 08:40:44