Изменения пользовательского интерфейса в фоновом потоке из-за NSUserDefaultsDidChangeNotification - PullRequest
1 голос
/ 16 апреля 2011

Я отлаживаю проблему, которая иногда приводит к сбою моего приложения с сообщением WebTryThreadLock в отчете о сбое. Похоже, что приложение падает, потому что 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
}

1 Ответ

4 голосов
/ 03 января 2012

Вы должны отправить сообщение в очередь отправки потока пользовательского интерфейса и оттуда внести изменения в пользовательский интерфейс.

Примерно так:

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

См. Документация Apple Grand Central Dispatch

--- Дейв

...