Core Dataでは、スレッドセーフの問題を常に回避しています。2つの異なるスレッドの1つでフェッチを実行NSManagedObjectContext
すると、デッドロックが保証されます。AppleのCoreDataプログラミングガイドでは、スレッドの制限を使用することを提案していますが、これを実現するためのパターンは提供されていません。私は以下の迅速で汚い解決策を持っています:
- (NSManagedObjectContext *) managedObjectContext
{
NSManagedObjectContext *moc = objc_getAssociatedObject([NSThread currentThread], _cmd);
if (!moc && self.persistentStoreCoordinator)
{
moc = [[NSManagedObjectContext alloc] init];
moc.mergePolicy = NSOverwriteMergePolicy;
moc.persistentStoreCoordinator = self.persistentStoreCoordinator;
objc_setAssociatedObject([NSThread currentThread], _cmd, moc, OBJC_ASSOCIATION_RETAIN);
}
return moc;
}
このメソッドは、アプリのデータスタックを管理する独自のクラスに表示されます。MOCを現在のスレッドに関連付けます。これは私にはもっともらしい解決策のように思えますが、速くて緩いようにも見えます。
このような解決策を試みることについて何を心配する必要がありますか?