今日、スタック オーバーフローに関するすべての CoreData の質問を読んだような気がしますが、まだ非常に行き詰まっています。:)
私は、スタンフォード大学の cs193p 講義 14 (Photomania アプリ) で説明されている方法に基づいた CoreData を使用するアプリケーションに取り組んでいます。これは、NSFetchedResultsController デリゲートを実装する UITableViewController サブクラスを使用します。もちろん、テーブルは結果がフェッチされると自動的に更新されます。
すべてが機能しますが、ドキュメントにデータが入力されると UI がブロックされます。これは、メイン スレッド (ドキュメントの managedObjectContext) で発生するためです。すでにバックグラウンド スレッドでデータをダウンロードしています。これは、ブロッキングの原因となっている NSManagedObjects を実際に設定するコードにすぎません。この講義では、NSManagedObjectContext の Parent コンテキストを使用して Document をバックグラウンドでロードし、メインスレッドでデータを「再フェッチ」してテーブルにデータを入力することをほのめかしています。テーブルに二重のエントリが頻繁に表示されることを除けば、ほとんど機能しています(と思います)。[self.tableView beginUpdates] / [self.tableView endUpdates] のようなものは解決されるようですが、バックグラウンド コンテキストで NSManagedObjectContext の保存を行っているため、どこに置くかわかりません。
私はまた、これについて完全に間違った方法で進んでいるかもしれません。:) いずれにしても、関連するコードは次のとおりです。
NSManagedObjectContext *backgroundContext;
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// document is my UIManagedDocument
backgroundContext.parentContext = document.managedObjectContext;
[backgroundContext performBlockAndWait:^{
// Do stuff here to populate the document.
[backgroundContext save:nil];
}];