Core data 我可以在并发GCD队列中将NSManagedObjectContext与NSPrivateQueueConcurrencyType一起使用吗

Core data 我可以在并发GCD队列中将NSManagedObjectContext与NSPrivateQueueConcurrencyType一起使用吗,core-data,nsmanagedobjectcontext,Core Data,Nsmanagedobjectcontext,到目前为止,我的方法是这样的: 1-主上下文初始化如下: _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL opti

到目前为止,我的方法是这样的:

1-主上下文初始化如下:

_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    DDLogModel(@"Unresolved error %@", error.localizedDescription);
    return;
}

self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
self.context.persistentStoreCoordinator =_persistentStoreCoordinator;
2-然后,当我着手创建核心数据对象或同时修改它们的关系时:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
tempContext.persistentStoreCoordinator = self.persistentStoreCoordinator;

//  Do stuff

[tempContext save:nil];
});
3-最后,通过NSManagedObjectContextDidSaveNotification合并主上下文

但是,我最近看到了一种不同的方法,对于步骤2,他们使用NSPrivateQueueConcurrencyType创建上下文,使其成为主上下文的子上下文,并通过-performBlock执行任何工作:

最后一种方法在默认情况下是并发的吗?即使没有显式地将其分派为并发的?或者与我解释的方法相比有什么优势

另一件让我不舒服的事情是,即使上下文有parentContext和persistentstorecordinator属性,设置后者似乎意味着不能设置前者。也就是说,具有持久存储协调器的上下文实际上将该存储协调器作为其父上下文

更新:
另一件有趣的事情是,使用我上面描述的使用GCD的方法,everynow,然后当我执行[tempContext save:]时,我会得到一个奇怪的行为:假设我传入了一个NSError对象,则不会返回任何错误,这与示例中不同,但如果我将通用Objective-C异常指针设置为on,则后台线程会在那里停止,好像有个例外。但是,如果我继续,应用程序不会崩溃并继续运行,主主主运行中心似乎很好

你说得对。performBlock将在后台自动执行工作。在某些情况下,使用当前线程main或background可能有意义,在这种情况下,您可以使用performBlockAndWait。建议使用子上下文

我想你的设置也可以。我猜使用子上下文的优势在于更结构化的保存方法,即将保存推到父上下文中。实际上只有父上下文才会接触到持久性存储,因此这在线程安全方面更好


你的最后一个问题不清楚。上下文只能有一个上下文作为其父上下文,而不能有一个持久存储协调器。然而,可能让您困惑的是,在iOS 5之前,只有一个父存储,并且随着子上下文的引入,它可以选择性地被父上下文替换。阅读所有相关内容。

当您说performBlock在后台工作时,您的意思是同时工作吗?因为我把它作为后台线程,可能只会和主线程一起抢占。也就是说,时间切片,但仍然是连续的。如果是这样的话,我认为我的方法会更快,因为我明确地同时进行。另外,我的最后一个问题是因为我观察到,如果我创建一个上下文并给它分配一个持久的存储协调,如果我尝试给它分配一个父上下文,它会告诉我它已经有了一个,但我只给它分配了一个存储协调!。是的,我的意思是同时。应使用NSPrivateQueueConcurrencyType初始化子上下文,以使其正常工作。效果应该是一样的。除非有多个处理器,否则并发总是与时间切片一起工作。-对于PSC问题,请阅读我的答案!我还有几个问题:具有NSPrivateQueueConcurrencyType的moc是否隐式创建了自己的队列?还是我仍然需要在GCD并发队列中创建它?此外,如果一个子对象将更改推送到父对象,并且只有父对象保存,这是否意味着如果我告诉正在处理单个对象的子moc保存,父对象将保存,因此父moc中具有挂起更改的任何其他对象也将保存?因为我只想保存子对象中的更改另一件有趣的事情是,使用我上面描述的使用GCD的方法,everynow,然后当我执行[tempContext save:]时,我会得到一个奇怪的行为:假设我传递了一个NSError对象,则不会返回任何错误,与示例中不同,但是如果我将通用的Objective-C异常指针设置为on,后台线程就会停止,就像发生了异常一样。但是,如果我继续,应用程序不会崩溃并继续运行,主moc似乎很好。实际上,我一直在测试[[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType],它从不在主线程以外的线程中执行。所以它甚至不是并发的:/