ご想像のとおり、ちらつきは [self.tableView reloadData]; を呼び出すことによって発生します。特に iOS 5.x デバイスでは、迅速かつ繰り返し発生します。ただし、テーブル全体を再読み込みするのではなく、テーブルの表示セル内のビューだけを更新したい場合があります。
ファイルのダウンロード中に最新のダウンロード % を反映するようにテーブルの各セルを更新するとします。私の例では、[downloading:totalRead:totalExpected:] メソッドが呼び出されます。バイトがダウンロードされると、非常に急速に呼び出されます。
これはしてはいけないことです...少し更新するたびにテーブルをリロードします(この例では、開発者は「cellForRowAtIndexPath」または「willDisplayCell」メソッドに依存して、すべての表示セルの更新を実行できます):
- (void)downloading:(PPFile *)file totalRead:(long long)read totalExpected:(long long)expected {
// Bad! Causes flickering when rapidly executed:
[self.tableView reloadData];
}
以下はより良い解決策です。セルのビューを更新する必要がある場合は、テーブルから表示されているセルのみを取得してそのセルを見つけ、テーブルをリロードせずにそのセルのビューを直接更新します。
- (void)downloading:(PPFile *)file totalRead:(long long)read totalExpected:(long long)expected {
NSArray *cells = [self.tableView visibleCells];
for(MYCellView *cell in cells) {
if(cell.fileReference == file) {
// Update your cell's view here.
}
}
}
編集:ドキュメントは同じことを推奨しています:
このメソッドを呼び出すと、テーブル ビューはデータ ソースに指定されたセクションの新しいセルを要求します。テーブル ビューは、古いセルをアニメーション化するのと同じように、新しいセルの挿入をアニメーション化します。指定されたセクションの値が変更されていることをユーザーに警告する場合は、このメソッドを呼び出します。ただし、ユーザーに警告せずに指定したセクションのセルの値を変更したいだけの場合は、それらのセルを取得して新しい値を直接設定できます。