Ответ 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
});