2011-04-15 86 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

相关问题