MarcusZarraによるコアデータのインポートと表示に関する次のリンクを読むことをお勧めします。
スレッドを扱う場合、作成する各スレッドは、 jrturtonが提供したリンクに記述されている独自のコンテキストを持っている必要があります。次に、メインコンテキスト(メインスレッドで作成したもの)と他のコンテキスト(コンテキストで使用するもの)の間で変更をマージする場合は、メインスレッドでリッスンする必要がありNSManagedObjectContextDidSaveNotification
ます
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextHasChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];
のようにマージします
- (void)contextHasChanged:(NSNotification*)notification
{
if ([notification object] == [self mainObjectContext]) return;
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextHasChanged:) withObject:notification waitUntilDone:YES];
return;
}
[[self mainObjectContext] mergeChangesFromContextDidSaveNotification:notification];
}
通知オブジェクトには、スレッドコンテキストで行った変更が含まれています。
いくつかのメモ
スレッド化は困難です。私が提供したリンクは、NSOperation
そのコンテキストでを使用しています。これはセットアップが非常に簡単ですが、iOS 5以降、あなたの生活を楽にするいくつかの機能があります。
たとえば、別のスレッドでコンテキストを作成するには、次のように実行できます。
// create a context with a private queue so access happens on a separate thread.
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// insert this context into the current context hierarchy
context.parentContext = context;
// execute the block on the queue of the context
[context performBlock:^{
// do your stuff (e.g. a long import operation)
// save the context here
// with parent/child contexts, saving a context pushes the changes out of the current context
NSError* error = nil;
[context save:&error];
}];
さらに、のドキュメントを見ることができますUIManagedDocument
。このクラスはCoreDataとうまく統合され、CoreDataスタックの使用を回避できます。
それが役に立てば幸い。