Я вызываю метод setNeedsDisplay
в новом потоке, но не вижу никаких изменений в своем представлении. Что мне сделать, чтобы увидеть все мои изменения после вызова setNeedsDisplay
в новом потоке?
setNeedsDisplay не работает в фоновом потоке
Ответы (2)
Вы не можете обновить пользовательский интерфейс в фоновом потоке. В фоновом потоке измените
[object setNeedsDisplay];
to
[object performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];
Любые обновления, связанные с пользовательским интерфейсом, должны выполняться в основном потоке. Как правило, фоновые потоки используются для трудоемких задач, таких как загрузка файлов, анализ данных и т. д.
Ваш основной поток отвечает за обновление пользовательского интерфейса и реагирование на события и действия пользователей. Это основная причина, по которой у нас есть фоновые потоки, чтобы управлять использованием памяти и повышать производительность, сохраняя основной поток как можно более свободным для ответа пользователю, в то время как трудоемкие задачи, которые обычно блокируют основной поток, выполняются в задний план.
После того, как вы обработали все необходимые данные и информацию в фоновом потоке, вы должны зафиксировать любые изменения в пользовательском интерфейсе в соответствии с вашими данными, отправив их в основной поток:
dispatch_async(dispatch_get_main_queue(), ^{
//do UI stuff
});
Другой способ отправки в основной поток выглядит следующим образом:
[self performSelectorOnMainThread:@selector(doUIStuff:) withObject:stuff waitUntilDone:NO];