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

Запустить MBProgressHUD в другом потоке?

Я использую MBProgressHUD для отображения "занятой" анимации для использования пользователя во время заполнения UITableView. UITableView блокирует основной поток, поэтому анимация даже не появляется, пока таблица не закончит загрузку.

Есть ли способ заставить оживленную анимацию работать в другом потоке, а UITableView занимает основной поток?

4b9b3361

Ответ 1

UIKit делает свой рисунок, когда цикл цикла завершает текущий цикл. Другими словами, если вы настраиваете представление (например, MBProgressHUD), изменения не будут видны до следующей итерации цикла выполнения. Таким образом, если вы не позволяете циклу запуска вращаться, заблокировав основной поток, изменения пользовательского интерфейса не появятся сразу.

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

Вы можете сделать это, запланировав выполнение на следующей итерации цикла запуска.

// Setup and show HUD here

[self performSelector:@selector(myTask) withObject:nil afterDelay:0.001];

Скрыть HUD в конце myTask. Или вы можете запустить цикл выполнения вручную.

// Setup and show HUD here

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]];

// Insert myTask code here
// Hide the shown HUD here

Или (если вы можете использовать блоки)

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){
    // Insert myTask code here
});