2011-04-15 59 views
1

我正在調試一個問題,偶爾會導致我的應用在崩潰報告中出現WebTryThreadLock消息。它看起來像應用程序崩潰,因爲NSUserDefaultsDidChangeNotification正在後臺線程上發送和接收。在收到通知時我會對UI進行更改,並且瞭解在後臺線程上進行UI更改的強烈建議。由於NSUserDefaultsDidChangeNotification導致的後臺線程上的用戶界面變更

如果NSUserDefaultsDidChangeNotification有時(如果不是總是)在後臺線程上發送,那麼處理此問題的最佳方法是什麼?像下面這樣的東西似乎過度但可能是必要的。

[[NSNotificationCenter defaultCenter] 
addObserver:self 
selector:@selector(userDefaultsDidChange) 
name:NSUserDefaultsDidChangeNotification 
object:nil]; 

- (void)userDefaultsDidChange { 
    [self performSelectorOnMainThread:@selector(updateUIWithNewUserDefaults) 
          withObject:nil 
         waitUntilDone:NO]; 
} 

- (void)updateUIWithNewUserDefaults { 
    // Update UI 
} 
+0

這正是去了解它的方式。正如你所說的,UIKit不是線程安全的。 – Rog 2011-04-15 21:34:08

回答

4

您應該向UI線程的調度隊列發送消息,並從那裏進行UI修改。

像這樣:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // your code here 
}); 

Apple's Grand Central Dispatch documentation

---戴夫

+3

dispatch_get_global_queue()返回給定優先級的併發隊列,而不是主隊列。您使用dispatch_get_main_queue()獲取主隊列,這是一個串行隊列。 – 2012-01-03 12:57:19

+0

啊,是的,你是對的。我還是這個平臺的新手:) – 2012-01-23 19:45:52

+0

是的,無論是這個還是我在原始問題中提出的基於選擇器的方法都適合。 – 2012-10-21 22:57:57

相關問題