Запустить MBProgressHUD в другом потоке? - PullRequest
18 голосов
/ 16 апреля 2011

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

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

1 Ответ

40 голосов
/ 29 апреля 2011

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
});
...