私はこれにやや行き詰まっています...どんな助けも大歓迎です。私はすでにこれをデバッグするのに多くの時間を費やしました。
がUITableView
提供するデータ ソースを使用していNSFetchedResultsController
ます。別のビュー コントローラーで、 を使用して新しいレコードを CoreData に挿入し[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
、管理オブジェクト コンテキストを保存して、そのコントローラーを閉じます。非常に標準的なもの。
管理対象オブジェクト コンテキストの変更は、次のように受信されNSFetchedResultsController
ます。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch (type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
break;
}
}
ここで問題が発生します。これには時間がかかりすぎます (iPhone 4 では約 3 ~ 4 秒)。そして、セルのレイアウトの計算に時間が費やされているようです。
セル (カスタム サブクラスを含む) からすべてを削除し、そのまま残しましたUILabel
が、何も変わりませんでした。次に、セルのスタイルを基本 (またはカスタム以外のもの) に変更すると、問題はなくなりました。新しいセルが即座に追加されます。
チェックを二重にしましたが、NSFetchedResultsControllerDelegate
コールバックは 1 回だけ呼び出されます。それらを無視して実行すると[UITableView reloadSections:withRowAnimation:]
、何も変わりません — それでも非常に遅いです。
デフォルトのセルスタイルでは自動レイアウトが無効になっているように思えます。これにより、非常に高速になります。しかし、その場合 — を押すとすべてがすばやく読み込まれるのはなぜUITableViewController
ですか?
その問題の呼び出しトレースは次のとおりです。
問題は、ここで何が起こっているのかということです。セルのレンダリングが非常に遅いのはなぜですか?
更新 1
私が抱えている問題を説明する非常に単純なデモアプリを作成しました。ソースはこちら — https://github.com/antstorm/UITableViewCellPerformanceProblem
パフォーマンスの問題を感じるために、少なくとも画面一杯のセルを追加してみてください。
また、行を直接追加しても ([今すぐ挿入] ボタン)、速度が低下することはありません。