在另一个线程中运行MBProgressHUD?

时间:2011-04-16 08:27:13

标签: cocoa-touch uitableview mbprogresshud

我正在使用MBProgressHUD来显示“忙”动画,以便在填充UITableView时使用用户。 UITableView阻塞主线程,因此在表完成加载之前,动画甚至不会出现。

UITableView占据主线程时,有没有办法让繁忙的动画在另一个线程上运行?

1 个答案:

答案 0 :(得分:40)

当运行循环完成当前循环时,UIKit会进行绘制。换句话说,如果您正在配置视图(例如,MBProgressHUD),则在下一次运行循环迭代之前,更改将不可见。因此,如果您不通过阻止主线程来允许运行循环旋转,则UI更改将不会立即显示。

如果无法在后台线程上完成工作,则需要在主线程上启动长时间运行的阻塞任务之前允许运行循环完成其循环。

您可以通过在下一个运行循环迭代中安排执行来完成此操作。

// Setup and show HUD here

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

在myTask结束时隐藏HUD。 或者您可以手动运行运行循环。

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