2011-11-03 25 views
8

我試圖獲得一個twitter賬戶列表來加載一個包含數據的UITableViewController。我用這個功能:(iOS 5)當獲取Twitter賬戶列表時,TableView掛起?

- (void)viewDidLoad { 
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { 
     ... 
     [[self tableView] insertRowsAtIndexPaths ...]; 
     [[self tableView] reloadData]; 
     NSLog("This message appears immediately"); 
     ... 
    }]; 
    NSLog("This message appears immediately"); 
} 

出於某種原因,該接口似乎表實際上被更新/重繪前「掛」 5秒(注意,我打電話reloadData!)。我所有的日誌消息都會立即打印出來,所以我不確定是什麼導致界面凍結。

回答

16

全部,

所以,我想通了(有點)。我想這與線程有關,我不應該在那個線程中做任何UI的東西。

要解決它,我包圍表的東西與一些調度代碼:

[account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) 
{ dispatch_async(dispatch_get_main_queue(), ^{ 
    ... 
});}]; 

還是需要明白是怎麼回事,但我希望如果有人跑進了同樣的問題,這將幫助。

+0

問題是UI調用必須發生在主線程上,'-requestAccessToAccountsWithType:withCompletionHandler:'不能保證它的完成塊會在主線程上被調用。你在這裏使用'dispatch_async'是正確的,但是如果你在你的UI調用之前有更多的處理要做,那麼你可以在'dispatch_async'調用之前在後臺隊列中自由地執行它。 –

+0

感謝隊友,與另一種觀點推遲了相同的問題。這爲我解決了它。 – thgc

+2

Apple的示例代碼使用performSelectorOnMainThread:withObject:waitUntilDone:處理處理程序方法在任意隊列上執行的事實。 – sam