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