3

Я использовал UIAlertController в предыдущих приложениях, но на этот раз я столкнулся с странной ошибкой. Вот мой код, который я использую для его представления:Ошибка UIAlertController для представления в backgroundThread объекте C

 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:ALERT_TITLE_STRING message:message preferredStyle:UIAlertControllerStyleAlert]; 
    [alertController addAction:[UIAlertAction actionWithTitle:OK_STRING style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

    }]]; 
    [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alertController animated:YES completion:^{ 

    }]; 

Все было нормально, но теперь я нахожусь на последней строке моего приложения. Вот ошибка:

This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.

Я не использую autolayout в моем приложении. Я понятия не имею, почему я получаю эту ошибку.

Любые подсказки?

+1

Почему вы не пытаетесь представить 'alert' в основной теме? – anhtu

+0

Метод, который заполняет контроллер предупреждений, вызывается в фоновом потоке – iBug

+0

Но вы можете вызвать 'alert' в основном потоке с' dispatch_asyn'. – anhtu

ответ

9

Эта ошибка отображается при попытке выполнить задачи пользовательского интерфейса в фоновом потоке. Просто измените свой код на это:

dispatch_async(dispatch_get_main_queue(), ^{ 

     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:ALERT_TITLE_STRING message:message preferredStyle:UIAlertControllerStyleAlert]; 
    [alertController addAction:[UIAlertAction actionWithTitle:OK_STRING style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

    }]]; 


     [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alertController animated:YES completion:^{ 
    }]; 
    }); 
+0

Спасибо. Это решило мою проблему. Я обновил свою архитектуру и назвал этот метод основным потоком, а не внесением этого изменения. Я ценю ваши усилия :) – iBug

2

Вам не разрешено выполнять операции пользовательского интерфейса для любого потока, кроме основного потока. Контроллер предупреждения будет автоматически использовать автозапуск, поэтому вы видите ошибку.

Используйте dispatch_async, чтобы вместо этого оповестить основную нить.

5

Вы не можете обрабатывать интерфейс ни в какой другой теме, кроме основной.

Если вы в настоящий момент находитесь в другом потоке, вы можете принудительно выполнить блок кода в основном потоке, поместив его в следующий блок.

dispatch_async(dispatch_get_main_queue(), ^{ 
     //Display your UIAlertController here 
    }); 
Смежные вопросы