【发布时间】:2011-04-16 08:27:12
【问题描述】:
我正在使用MBProgressHUD 在填充 UITableView 时显示“忙碌”动画以供用户使用。 UITableView 阻塞了主线程,因此动画在表格加载完成之前甚至不会出现。
有没有办法让忙碌的动画在另一个线程上运行,而UITableView 占据了主线程?
【问题讨论】:
标签: cocoa-touch uitableview mbprogresshud
我正在使用MBProgressHUD 在填充 UITableView 时显示“忙碌”动画以供用户使用。 UITableView 阻塞了主线程,因此动画在表格加载完成之前甚至不会出现。
有没有办法让忙碌的动画在另一个线程上运行,而UITableView 占据了主线程?
【问题讨论】:
标签: cocoa-touch uitableview mbprogresshud
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
});
【讨论】:
dispatch_after 也很有效!!哈哈!!