私たちのアプリでは、テーブル ビューでコア データと nsfetchedesultscontroller を使用しています。一部のエンティティには、nsfetchedesultscontroller およびテーブル ビューに関連付けられている同じエンティティである 50k エントリを含めることができます。
私の問題は、そのエンティティでフェッチを実行するバックグラウンド クエリがいくつかあることです (3 秒以上かかる場合があります) と同時に、nsfetchedesultscontroller が同じエンティティでフェッチを実行してテーブル ビューを埋めようとしています。
現在、bg クエリの 1 つが実行されている場合、テーブル ビューのスクロールが遅くなり、クロールします。一方、継続的にスクロールしている場合、スクロールを停止し、おそらく nsfetchedesultscontroller がエンティティ/ファイル システムへのアクセスを停止するまで、bg クエリは実行されませんか?
- これは、コア データが一度に 1 つのフェッチ要求のみを受け入れ、すべての読み取り要求を順次処理するということですか?
- Core Data は、クエリの実行中に sqlite db をロックしていますか?
- これを改善する方法はありますか?
すべての bg クエリは、独自の NSPrivateQueueConcurrencyType コンテキストを使用して実行ブロックで実行されます
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
[operation addExecutionBlock:^{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setUndoManager:nil];
[context setPersistentStoreCoordinator:[RootUtility getPersistentStoreCoordinator]];
[context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:context];
// perform long running query
}];