0

多くの場合、ビューコントローラをプッシュして、UIデータを埋めるためにコアデータからオブジェクトを取得している状況があります。今私は通常、メインスレッドのviewDidLoadでこれをフェッチし、これを行うためのより良い方法があると確信しています。多分、別のスレッドで。Objective c - viewDidLoadのコアデータオブジェクトを取得する

実際にスレッドがここに行く方法であれば、目的のCのスレッドに関する多くの経験はありません。そのため、コード例を示すことができたら本当に感謝します。

また、コアデータがスレッドセーフではないことを知っていますので、余分な作業を安全な側にする必要がありますか?

答えて

2

おそらくNSFetchedResultsControllerを使用しているはずです。バッチ処理を管理し、その時に必要なものだけをロードします。単なるテーブルビューではありません。別のスレッドを使用せずにこれを行うことができます(DBが大きすぎず、フェッチに複雑な述語がなく、DB内のすべてのレコードを参照する必要がない限り)。

FRCの代わりに、またはすべてのレコードが必要な場合は、別のスレッドを使用してオブジェクトをフェッチし、メインスレッドに提示することができます。

これは、単一のSO回答で説明するのは難しい概念です。それでも意味をなさない場合は、「コアデータ並行処理プログラミングガイド」を参照してください。

または、すべてをロードして何らかの制御をしたい場合は、次のようにすることができます。注:私はこの二重のMOCパターンはとにかく行く方法だと思う、それはバックグラウンドをとにかく行うことが容易になるからだ。その点については、UIManagedDocumentを使用すると、ほとんどの場合これを無料で利用できます。

これは、全体的には読み込みに時間がかかりますが、UIスレッドを解放することに注意してください。私は1つのMOCを使用して、すべてのクラスの間でそれを共有するすべての私のアプリを通じて...

// The actual work will run in the background on the worker queue 
// The "worker" queue will do the fetching and faulting, then pass object IDs 
// to the mainMoc, which will fault its MOs from the parent 
[workerMoc performBlock:^{ 
    NSFetchRequest *fetchRequest = // Create fetch request 
    NSArray *fetchResults = [workerMoc executeFetchRequest:fetchRequest error:0]; 
    [fetchResults enumerateObjectsUsingBlock:^(NSManagedObject *obj, NSUInteger idx, BOOL *stop) { 
     // Probably want to fault the object in before going to mainMoc 
     // since that can also take some time... 
     // Can also "batch" them in some small number of objects. 
     NSManagedObjectID *objectID = obj.objectID; 
     [mainMoc performBlock:^{ 
      NSManagedObject *fetchedObject = [mainMoc objectWithID:objectID]; 
      // Do something with it now that you are back on the main thread... 
     }]; 
    }   
}]; 
+0

をロードする際

NSManagedObjectContext *workerMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; workerMoc.persistentStoreCoordinator = psc; // The "mainMoc" will be a child of the worker NSManagedObjectContext *mainMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; mainMoc.parentContext = workerMoc; 

はその後、これは二つの異なるMOC年代を作成するために必要ですか? – Eyal

+0

複数のスレッドからMOCにアクセスしてはなりません。したがって、別のスレッドでデータベースに関連する操作を実行する場合は、別のMOCを使用する必要があります。しかし、最初の文に注意してください。その場合、NSFetchedResultsControllerを使用するだけであれば、メインスレッドでフェッチするため、別途MOCは必要ありません。 –

+0

mainMOCは共有されているので、毎回workMocを作成する必要があります。私はNSFetchedResultsControllerについて何を言っているのか理解できませんでした。私はそれを使用すれば、別のスレッドで使用する必要はありませんか?また、メインスレッドをブロックすることもできますか? – Eyal

関連する問題