1

我的 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];

我现在的工作方式是两个上下文都不是另一个上下文的父级,他们只是使用同一个商店,它似乎工作正常。此方法基于 Apple 下载地震数据的示例,该示例曾经在 Obj-C 中,但现在仅在 Swift 中可用。

https://developer.apple.com/library/archive/samplecode/Earthquakes/Introduction/Intro.html

为什么前两个相反,每种方式的优点/缺点/差异是什么?为什么 Apple 示例根本不使用父级?

此外,一些示例(在类似情况下)显示两个上下文共享一个 NSPersistentStoreCoordinator,但我的(如上面的示例)每个上下文都拥有自己的 PSC,即使它们都指向同一个存储文件。更好的方法是什么?

我有一种情况,用户可以编辑下载的数据。谁(如果有的话)是父上下文会有所不同吗?

4

0 回答 0