核心数据ManagedObjectContext和Private Queue,父上下文的角色

时间:2018-07-21 17:38:47

标签: managedobjectcontext

我的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中使用,但现在仅在Swift中可用。

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

为什么前两个是相反的,每种方式的利弊是什么?为什么苹果示例根本不使用父母?

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

我有一种情况,用户可以编辑下载的数据。谁在哪里(如果有)是父上下文的差异?

0 个答案:

没有答案