1000個を超えるセルを含むテーブルビューがあります(画面に約10個表示されます)。ユーザーによる「フィルター」アクションに続いて、それらの約80%を削除し、2番目のフィルターの後にさらに80%を削除します。100個のセルを操作する場合はほぼ瞬時ですが、1000個の場合はメソッド[tableView endUpdates]を完了するのに0.5秒かかり、これによりユーザーエクスペリエンスが完全に破壊されます。
次のようにインデックスパスの配列を作成します。
for (int i=1; i<[appDelegate.myArray count]; i++) { //more than 1000 objects in myArray
if (![[appDelegate.myArray objectAtIndex:i] myTest]) { //myTest returns a BOOL
[appDelegate.rowsToDelete addObject:[NSIndexPath xxxxx]]; //the index path of the object that just failed the test and must be removed];
}
}
[self.myTableViewController.tableView deleteRowsAtIndexPaths:appDelegate.rowsToDelete withRowAnimation:UITableViewRowAnimationRight];
私は2つの解決策を試しました。1つはスレッド化で、tableViewが更新されているときにUIの他の部分が移動しているのをユーザーが確認できるようにします。しかし、彼が別のレベルのフィルタリングを開始した場合、これはクラッシュではないにしても、多くの場合、長い待機になります。
また、最初のいくつかのセル(画面上のセル)を削除してから、テストに失敗した他のオブジェクトをデータソースから削除しようとしましたが、対応するセルは見えないため、tableViewから削除しませんでした。これにより、良好で迅速な結果が得られますが、次のような行数の問題が発生します。
'無効な更新:セクション0の無効な行数。更新後の既存のセクションに含まれる行数(94)は、更新前のそのセクションに含まれる行数(927)に、プラスマイナスそのセクションから挿入または削除された行の数(0が挿入され、215が削除されました)。
誰かがそのようなパフォーマンスの問題を抱えていましたか?それを解決する方法は?乾杯、CD