Ответ 1
Никогда не делайте ничего с графическим интерфейсом, кроме основного потока. Это может вызвать очень странные проблемы и проблемы, с которыми вы не хотите иметь дело. Обычно обратные трассировки также очень бесполезны, поэтому старайтесь избегать таких проблем по умолчанию.
Поэтому используйте это:
[self performSelectorOnMainThread:@selector(showAlert:) withObject:alertString waitUntilDone:NO];
Если вы используете Grand Central dispatch, вы можете сделать что-то вроде:
dispatch_async(dispatch_get_main_queue(), ^{ /* show alert view */ });
Update:
Swift (3.0 +):
DispatchQueue.main.async { // code }
Иногда бывает полезно сделать это с помощью Notifications
, который вы получаете также, у меня были экземпляры, в которых они были запущены из другого потока.
Обновление 2:
Похоже, что Apple добавила некоторые новые инструменты, входящие в iOS11/Xcode9, чтобы помочь отлаживать проблемы, когда материал вызывается в неправильном потоке.