1

私たちのアプリでは、テーブル ビューでコア データと 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 
}];
4

1 に答える 1

0

私も同じことを経験しました。メインの永続ストア コーディネーターを使用して行われている限り、同時フェッチ間にボトルネックがあるようです。私の解決策は、この投稿を使用することでした:

複数の NSPersistentStoreCoordinator インスタンスを同じ基盤となる SQLite 永続ストアに接続できますか?

また、NSPersistentStore のみを共有するバックグラウンド スレッドで個別のコア データ スタックを作成します。このように、このバックグラウンド スタックでの長いフェッチは、メイン スレッドをブロックしませんでした。

于 2013-12-08T23:32:48.893 に答える