私の macOS アプリは、ユーザーの読み取り専用データ (株価など) を定期的にダウンロードする必要があります。これを行うために、デュアル コンテキスト システムを構築しました。
@interface MyCoreDataStackManager : NSObject
@property (nonatomic, readonly) NSManagedObjectModel* managedObjectModel;
@property (nonatomic, readonly) NSPersistentStoreCoordinator* persistentStoreCoordinator;
@property (nonatomic, readonly) NSManagedObjectContext* managedObjectContext;
@property (nonatomic, readonly) NSURL* applicationSupportDirectory;
@property (nonatomic, readonly) NSURL* storeURL;
初期化中に、スタックは NSSQLiteStoreType と NSMainQueueConcurrencyType で構築されます。
バックグラウンドでのダウンロードと処理を可能にするために、同じモデルとストアを使用して別のコンテキストを作成する方法もありますが、独自の NSPersistentStoreCoordinator を使用します。プライベート コンテキストは NSPrivateQueueConcurrencyType を使用します。
-(NSManagedObjectContext *)privateContext
{
NSManagedObjectContext* privateContext = nil;
NSError* error = nil;
// Use the same store and model, but a new persistent store coordinator unique to this context.
NSPersistentStoreCoordinator* privateCoordinator = [[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]] autorelease];
if (privateCoordinator)
{
NSPersistentStore* privateStore = [privateCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:nil error:&error];
if (privateStore)
{
privateContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
if (privateContext)
{
[privateContext setPersistentStoreCoordinator:privateCoordinator];
[privateContext setUndoManager:nil];
}
}
}
return (privateContext);
}
このブログ投稿は同様の方法で行いますが、プライベート コンテキストをメイン スレッドの managedObjectContext の親にします。
http://martiancraft.com/blog/2015/03/core-data-stack/
[[self managedObjectContext] setParentContext:[self privateContext]];
このブログ投稿も同様の方法でそれを行いますが、メインスレッドコンテキストをプライベートコンテキストの親にします (「戦略 2」の下):
https://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131
[self.privateManagedObjectContext setParentContext:self.mainManagedObjectContext];
私の現在の動作方法は、どちらのコンテキストも他のコンテキストの親ではなく、同じストアを使用しているだけで、正常に動作しているようです。この方法論は、以前は Obj-C にあった地震データをダウンロードするための Apple の例に基づいていますが、現在は Swift でのみ利用可能です。
https://developer.apple.com/library/archive/samplecode/Earthquakes/Introduction/Intro.html
最初の 2 つが反対である理由と、それぞれの方法の長所/短所/違いは何ですか? Apple の例が親をまったく使用しないのはなぜですか?
さらに、いくつかの例 (同様のケース) は、単一の NSPersistentStoreCoordinator を共有する両方のコンテキストを示していますが、私の場合 (上記の例のように)、それぞれが同じストア ファイルを指しているにもかかわらず、それぞれのコンテキストが独自の PSC を所有しています。より良い方法は何ですか?
ユーザーがダウンロードしたデータを編集できるケースが 1 つあります。誰が(存在する場合)親コンテキストであるかに関して、違いはありますか?