Безопасно ли создавать экземпляр объекта пользовательского интерфейса в фоновом потоке? - PullRequest
2 голосов
/ 21 февраля 2012

Мне не ясно, насколько небезопасна работа с объектами пользовательского интерфейса. У меня есть код, который я только что переместил в другую очередь (используя NSOperation и NSOperationQueue). Я проверяю, где мне нужно очистить небезопасный код, и наткнулся на это:

alertNoDatabaseSelected = [[[UIAlertView alloc] 
    initWithTitle:NSLocalizedString(@"You Haven't Enabled Any Databases", nil) 
    message:[NSString stringWithFormat:NSLocalizedString(@"You can't search unless you choose at least one database in your settings.", nil), self.currentSearchEntity.keywords] 
    delegate:self cancelButtonTitle:NSLocalizedString(@"Settings", nil) 
    otherButtonTitles:nil] autorelease];
[alertNoDatabaseSelected show];

Являются ли обе эти линии небезопасными вне основного потока? У меня есть некоторые сбои, и это похоже на первый тип рефакторинга, на который я должен обратить внимание.

UPDATE Это может быть гораздо более серьезной проблемой. У меня есть два NSManagedObjectContexts, один в том же потоке, а другой в другом. Когда я синхронизирую эти контексты, может происходить много обновлений пользовательского интерфейса (особенно табличных представлений). Я хочу знать, нужно ли мне принимать какие-либо специальные меры, чтобы убедиться, что синхронизация автоматически запускает все это в главном потоке, или мне нужно что-то сделать, чтобы это произошло таким образом? (Возможно, мне придется написать еще один вопрос по этому вопросу.)

1 Ответ

1 голос
/ 21 февраля 2012

Вторая строка определенно небезопасна вне основного потока. Сам по себе alloc может быть приемлем для вторичного потока, но я не знаю, подходит ли метод init..., и разумно предположить, что это небезопасно.

Вы должны запланировать все свои обновления пользовательского интерфейса в главном потоке. Вы можете использовать [NSOperationQueue mainQueue], если хотите запланировать их как NSOperation объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...