2011-10-15 51 views
1

我有一個內部有2個視圖的UIView,一個是關於我們的頁面,另一個是通過uisegmentation控制的twitter流/頁面。如何在performSelectorInBackground後更新UItableview?

Twitter feed在didFinishLaunchingWithOptions上運行,並在後臺運行。

在Twitter頁面本身,我有一個重新加載按鈕,啓動相同的過程,再次在後臺執行。

我堅持,因爲表視圖從來沒有更新,即使

[self.tableView reloadData]; 
的performInSelector後直

因此我想要執行一次該表的數據的更新:

[自performSelectorInBackground:@selector(reloadTwitter :) withObject:無];

完成。

我該如何做這樣的工作?

回答

4

第一個答案可能會工作,但你可能不會有興趣使用GCD和塊。總的來說,真正的問題很可能是你不應該試圖在後臺線程中更新任何用戶界面元素 - 你必須從主線程中完成。

所以,你最好的選擇是很可能被刷新Twitter的飼料的方法中添加另一行:

[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:No]; 

蘋果的文檔在這個位置:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

檢查節標記爲「線程和您的用戶界面」。

+0

我不確定在哪裏把performSelectorOnMainThread,但這當然有幫助!這是個好主意! – zardon

+0

您需要將它放在您的後臺運行方法的末尾並更新Twitter提要。基本上在你有新數據顯示的地方。 – Carter

2

使用GCD和塊爲... :)

/* get a background queue (To do your things that might take time) */ 
dispatch_queue_t backgroundQueue = 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
/* get the main queue (To update the UI)*/ 
dispatch_queue_t mainQueue = dispatch_get_main_queue(); 

/* use dispatch_async to run something (twitter, etc) 
    asynchronously in the give queue (in the background) */ 
dispatch_async(backgroundQueue,^{ 
    [self reloadTwitter]; 
    /* use again dispatch_async to update the UI (the table view) 
    in another queue (the main queue) */ 
    dispatch_async(mainQueue,^{ 
    [self.tableView reloadData]; 
}); 
}); 
+0

聽起來很有趣,我會給它一個去,謝謝 – zardon