2011-04-16 117 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

相關問題