2012-05-23 52 views
1

A UIViewController需要大約半秒來載入其內容並出現在屏幕上。我怎樣才能讓它們全部在後臺加載,並在準備就緒時出現?如何在後臺線程中準備我的UI?

+0

看到這個問題的答案:http://stackoverflow.com/questions/6087068/thread-safe-uikit-methods – 2012-05-23 12:00:09

+1

不要做「UI的東西」在後臺線程。在初始化ViewController時做一些「UI stuff」,或者在ViewWillAppear中做。 – Martol1ni

回答

2

Apple開發人員網站上有一個LazyTableImages示例。

它顯示瞭如何在後臺線程中執行繁重的工作並更新主線程上的UI。

PerformSelectorInBackground:withObject:是一種可能的解決方案,但更現代的方法是使用異步塊。您可以在這些塊內的主線程上運行代碼以安全地更新UI。

The Concurrency Programming Guide是一個很好的地方找到更多的信息和這個例子。

0

最簡單的方法是使用NSObject的- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg您只需將它傳遞給選擇器,它將在後臺開心,並且不會阻止您的用戶界面。但請注意,後臺線程有規則。

您不應該從後臺線程更新您的用戶界面。你需要確保你所調用的方法是線程安全的。

1

後臺線程不能更新UI,可以在後臺線程中執行所有的處理邏輯和調用用於UI更新主線程

實施例加載的tableView使用數據,使用背景線程來處理一切和加載數據,使用主線程中調用[tableView reloadData],看到大中央調度知道如何與IOS中的線程工作..

希望它有助於

1

創建一個GCD隊列來處理在後臺線程你的工作(閱讀文檔,因爲我的「創建」標籤和選項可能不是你想要的T)。

您可以異步地將它發送到隊列,這意味着對dispatch_async的調用將爲您提供的代碼塊在另一個線程中運行做出適當的安排,然後它會立即返回給您。

您給它的塊中的所有工作都將在單獨的線程上執行。請注意,最後,您會進行另一個電話,這次是使用衆所周知的主隊列。這會安排代碼在主線程中運行,這對於任何UI工作都是必需的。

此外,你真的應該閱讀有關GCD和特別是塊的文檔,因爲有內存和循環考慮。祝你好運。

dispatch_queue_t workQ = dispatch_queue_create("bgWorkQ", 0); 
dispatch_async(workQ, ^{ 
    // This code is now running in a background thread. 
    // Do all your loading here... 
    // When ready to touch the UI, you must do that in the main thread... 
    disptach_async(dispatch_get_main_queue(), ^{ 
     // Now, this code is running in the main thread. 
     // Update your UI... 
    }); 
}); 
dispatch_release(workQ);