1

我正在调试一个问题,该问题偶尔会导致我的应用程序崩溃并WebTryThreadLock在崩溃报告中显示一条消息。看起来应用程序正在崩溃,因为NSUserDefaultsDidChangeNotification正在后台线程上发送和接收。我在收到通知时进行 UI 更改,并了解强烈建议不要在后台线程上进行 UI 更改。

如果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
}
4

1 回答 1

4

您应该向 UI 线程的调度队列发送一条消息,并从那里进行 UI 修改。

像这样:

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

请参阅Apple 的 Grand Central Dispatch 文档

--- 戴夫

于 2012-01-03T07:34:18.063 回答