2011-04-16 122 views
18

我正在使用MBProgressHUD显示一个“繁忙”的动画,以在UITableView被填充时使用用户。 UITableView会阻止主线程,所以直到表完成加载后才会出现动画。在另一个线程中运行MBProgressHUD?

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

回答

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

希望我能给予好评于此。 – 2012-05-15 09:18:56

+0

感谢,作品像魅力:) – 2012-09-05 12:16:18

+0

上述代码导致内存泄漏。任何想法如何解决它? – arundevma 2012-11-05 12:43:07

相关问题