私は多少このことに固執しています...どんな助けでも大歓迎です。私はすでにこれをデバッグするのに多くの時間を費やしました。AutoLayoutでUITableViewCellのパフォーマンスが悪くなる
私はUITableView
を持っています。データソースはNSFetchedResultsController
です。別のビューコントローラでは、[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
を使用してCoreDataに新しいレコードを挿入し、管理対象オブジェクトのコンテキストを保存し、そのコントローラを閉じます。非常に標準的なもの。管理対象オブジェクトコンテキスト内
変更は、その後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
としましたが、何も変更されませんでした。次に、セルのスタイルをBasic(またはCustom以外のもの)に変更し、問題が消えた - 新しいセルが瞬時に追加されます。
私はチェックを2倍しており、NSFetchedResultsControllerDelegate
コールバックは1回だけ呼び出されています。私がそれらを無視して[UITableView reloadSections:withRowAnimation:]
を行うと、何も変わらない - それはまだ非常に遅いです。
デフォルトのセルスタイルでは自動レイアウトが無効になっているようですが、非常に高速です。しかし、そうだとすれば、私がUITableViewController
を押すと、すべてが素早く読み込まれるのはなぜですか?
はここでその問題のためのコール・トレースです:
そこで質問です - ここで何が起こっていますか?なぜ細胞がゆっくりとレンダリングされているのですか?
UPDATE 1
私は私がいる問題を示して非常に簡単なデモアプリケーションを構築しました。ここにソースがあります - https://github.com/antstorm/UITableViewCellPerformanceProblem
パフォーマンスの問題を感じるには、少なくとも1画面のセルを追加してみてください。
また、行を直接追加すると([今すぐ挿入]ボタン)、遅くなることはありません。
あなたはカスタムセルに一意の識別子を割り当てて、再作成するのではなくデキューすることを訂正していますか? – James
とセルにはどの自動レイアウトルールが指定されていますか? – Wain
はい、私は一意の識別子を割り当て、 '[UITableView dequeueReusableCellWithIdentifier:forIndexPath:]'を使ってセルをデキューします。 –