Я загружаю данные из веб-службы в фоновый поток. Безопасно ли показывать UIAlertView
в фоновом потоке, если что-то пойдет не так, или я должен показать вид предупреждения в mainthread?
спасибо за совет
Франк
Я загружаю данные из веб-службы в фоновый поток. Безопасно ли показывать UIAlertView
в фоновом потоке, если что-то пойдет не так, или я должен показать вид предупреждения в mainthread?
спасибо за совет
Франк
Никогда не делайте ничего с графическим интерфейсом, кроме основного потока. Это может вызвать очень странные проблемы и проблемы, с которыми вы не хотите иметь дело. Обычно обратные трассировки также очень бесполезны, поэтому старайтесь избегать таких проблем по умолчанию.
Поэтому используйте это:
[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, чтобы помочь отлаживать проблемы, когда материал вызывается в неправильном потоке.
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
});
этот код работает для меня
Вы можете попробовать показать предупреждение в основном потоке:
UIAlertView *alert = [
[[UIAlertView alloc] initWithTitle:@"the title"
message:@"the message"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles: nil] autorelease];
[alert performSelector:@selector(show)
onThread:[NSThread mainThread]
withObject:nil
waitUntilDone:NO];
[alert release];