Подтвердить что ты не робот

Показать UIAlertView в фоновом режиме

Я загружаю данные из веб-службы в фоновый поток. Безопасно ли показывать UIAlertView в фоновом потоке, если что-то пойдет не так, или я должен показать вид предупреждения в mainthread?

спасибо за совет

Франк

4b9b3361

Ответ 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, чтобы помочь отлаживать проблемы, когда материал вызывается в неправильном потоке.

Ответ 2

dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
        });

этот код работает для меня

Ответ 3

Вы можете попробовать показать предупреждение в основном потоке:

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];