おそらく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...
}];
}
}];
をロードする際
はその後、これは二つの異なるMOC年代を作成するために必要ですか? – Eyal
複数のスレッドからMOCにアクセスしてはなりません。したがって、別のスレッドでデータベースに関連する操作を実行する場合は、別のMOCを使用する必要があります。しかし、最初の文に注意してください。その場合、NSFetchedResultsControllerを使用するだけであれば、メインスレッドでフェッチするため、別途MOCは必要ありません。 –
mainMOCは共有されているので、毎回workMocを作成する必要があります。私はNSFetchedResultsControllerについて何を言っているのか理解できませんでした。私はそれを使用すれば、別のスレッドで使用する必要はありませんか?また、メインスレッドをブロックすることもできますか? – Eyal