21

ユーザーがUISearchBar. ダウンロードと解析はスレッド化されておりNSNotification、完了すると、ViewController にテーブル ビューを指定して[tableView reloadData];

結果が入った後に発生した通知を受け取るコードは次のとおりです。

- (void)receivedResults:(id)notification {
    results = [notification object];
    DLog(@"Received %i results",[results count]);
    [[self tableView] reloadData];
}

「Received 4 results」というログ出力が表示されますが、数ピクセルスクロール/ドラッグするまで、テーブル ビューはデータをリロードしません。私は組み込みのUITableViewCellStyleSubtitleセル スタイルを使用していますが、高さを変更したり、テーブル ビューに派手な変更を加えたりしていません。

私は何を間違っていますか?

4

5 に答える 5

66

私は同じことを働かせることができました。しかし問題は、リロード データをメイン スレッドで呼び出す必要があることでした。

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});

これは performSelectorOnMainThread オプションよりも実用的だと思います

于 2012-08-15T22:03:39.230 に答える
34

電話

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

それ以外の

[self.tableview reloadData]
于 2011-03-24T13:50:38.627 に答える
4

私の問題は、バックグラウンド スレッドから NSNotification を投稿していたことです。これを回避するには、次のように postNotificationMethod を dispatch_async メソッドでラップするだけです。

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result];
});

この通知が受信tableView.reloadDataされると、メイン スレッドで が呼び出されます。

于 2014-08-30T13:25:19.273 に答える