18

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

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

4

1 回答 1

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
});
于 2011-04-29T16:17:51.887 回答