2011-11-03 8 views
8

私は、データを含む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

アップルのサンプルコードでは、performSelectorOnMainThread:withObject:waitUntilDoneを使用しています。ハンドラメソッドが任意のキューで実行されるという事実に対処するためです。 – sam

関連する問題