5 つのタブを持つタブ バー コントローラーがあります。各タブには、テーブル ビュー コントローラーがあります。そのうちの 2 つは NSFetchedResultsControllers です。
ユーザーがテーブル ビュー内の項目をタップすると、その項目は最初に履歴に保存され、次にセグエされて表示されます。これらの NSFetchedResultsControllers の 1 つは、表示された項目の履歴を日付順に表示します。
これらの NSFetchedResultsControllers のいずれも遅延インスタンス化されていない場合、パフォーマンスは良好です。
13:41:50.485 Saving to history…
13:41:50.487 CoreData: sql: BEGIN EXCLUSIVE
13:41:50.490 CoreData: sql: UPDATE ZSLBOOK SET ZDATEADDEDTOHISTORY = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ?
13:41:50.495 CoreData: sql: COMMIT
13:41:50.511 Saved
しかし、履歴の表示を担当する NSFetchedResultsControllers がインスタンス化された後、速度が劇的に低下し、1 ~ 2 秒かかり (さらに次のビューをレンダリングする)、アプリがハングしたように見えます。
13:42:08.750 Saving to history…
13:42:08.752 Will change
13:42:08.753 Object changed
13:42:09.579 Did change
13:42:09.594 CoreData: sql: BEGIN EXCLUSIVE
13:42:09.596 CoreData: sql: UPDATE ZSLBOOK SET ZCOVERIMAGE = ?, ZDATEADDEDTOHISTORY = ?, Z_OPT = ? WHERE Z_PK = ? AND Z_OPT = ?
13:42:09.619 CoreData: sql: COMMIT
13:42:09.637 Saved
何が起こっているのかを知るために、履歴を更新するためのコードを次に示します。
- (void)addToHistory
{
NSLog(@"Saving to history…");
self.book.dateAddedToHistory = [NSDate date];
NSError *error;
[self.managedObjectContext save:&error];
NSLog(@"Saved");
}
ログ メッセージは、次のメソッドで呼び出されます。
controllerWillChangeContent ("Will change")
controller:didChangeObject ("Object changed")
controllerDidChangeContent ("Did change")
NSFetchedResultsController は標準で実装されています。少数の行 (5 ~ 10 行) しかない場合でも、パフォーマンスが低下します。コア データは問題ありません (ログからわかるように非常に高速です)。バッチ サイズを 20 に設定し、インデックスなどを設定しました。したがって、問題は NSFetchedResultsController のどこかにあります。
可能性の 1 つは、TVC のフェッチ結果コントローラー デリゲートを nil に設定することです。ただし、更新を管理し、行を選択して最後の位置までスクロールするのは非常に困難です (データをリロードする必要があるため)。
問題の原因となっている可能性のあるアイデアはありますか? 膨大な数の行を持つテーブルが一瞬で読み込まれて表示されるため、このパフォーマンスが規則的であるとは思えません。