Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS/Objective-C:保存到后台线程中的核心数据_Ios_Core Data_Concurrency - Fatal编程技术网

iOS/Objective-C:保存到后台线程中的核心数据

iOS/Objective-C:保存到后台线程中的核心数据,ios,core-data,concurrency,Ios,Core Data,Concurrency,我正试图遵循以下Apple示例代码,以便在后台保存到核心数据的最佳实践,其中包括以下代码: NSArray *jsonArray = …; //JSON data to be imported into Core Data NSManagedObjectContext *moc = …; //Our primary context on the main queue NSManagedObjectContext *private = [[NSManagedObjectContext alloc

我正试图遵循以下Apple示例代码,以便在后台保存到核心数据的最佳实践,其中包括以下代码:

NSArray *jsonArray = …; //JSON data to be imported into Core Data
NSManagedObjectContext *moc = …; //Our primary context on the main queue

NSManagedObjectContext *private = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[private setParentContext:moc];
我的主要MOC是保存在一个属性中。但是,无论我是alloc init一个新的MOC还是使用属性中的MOC,我都会得到错误:

'Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.'
*** First throw call stack:
解决方案是指定MOC的并发类型,如下所示:

managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
这应该在主核心数据堆栈中完成吗?还是创建一个新的主运行中心?我尝试创建一个新的主运行中心,但得到一个错误,主运行中心为空。创建第二个主运行中心似乎是多余的,与私有主运行中心一起创建三个主运行中心。另一方面,我担心更改主核心数据堆栈,因为它可能会在应用程序中抛出其他东西


解决这个问题的最佳方法是什么?

主主主运行中心应该是后台私有运行中心的子级,而不是其他方式。无论何时保存主moc,私有moc都会得到更新(因此需要设置合并策略),然后保存到磁盘。在这种情况下,您不需要超过2个MOC

因为保存将在后台线程中进行,所以您的代码在主线程中会运行得更流畅

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // primary context on the main queue
moc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

NSManagedObjectContext *privateMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
privateMoc.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
[moc setParentContext:privateMoc];