我现在因为讨厌的核心数据问题而陷入困境大约两周.我阅读了很多博客文章,文章和SO问题/答案,但我仍然无法解决我的问题.
我运行了很多测试,并且能够将更大的问题减少到更小的问题.这将是一个很大的解释,所以请跟我一起!
我必须得到以下datamodel:
对象A与对象B具有一对多的关系,它与对象C具有另一个一对多的关系.由于核心数据的建议,我必须创建反向关系,因此B的每个实例都指向其父A和相同的C指向其父B.
A <->> B <->> C
Run Code Online (Sandbox Code Playgroud)
为了保持响应顺畅,我创建了一个三级的managedObjectContext结构.
NSPrivateQueueConcurrencyType,是紧的persistentStoreCoordinatorNSMainQueueConcurrencyType并拥有父MOC 1我的主数据控制器作为观察者被添加到NSManagedObjectContextDidSaveMOC 2 的通知中,因此每次MOC 2保存时performBlock:,MOC1被触发,执行保存操作(由于异步performBlock:).
为了将大型JSON文件解析为我的Core Data结构,我编写了一个循环解析器.该解析器首先创建一个新的MOC(3).然后它获取对象A的数据并解析其属性.然后解析器读出B的JSON关系并创建填充数据的相应对象.通过调用addBObject:A 将这些新对象添加到A.因为解析器是循环的,解析B意味着解析C,这里也创建新对象并附加到B.这一切都发生在performBlock:MOC 3上.
在每次解析操作之后,我保存MOC 3并在mainThread上调度主MOC(2)的保存操作.由于NSManagedObjectContextDidSave通知MOC 1将异步自动保存.
if (parsed){
NSError *error = nil;
if (![managedObjectContext save:&error])
NSLog(@"Error while saving parsed data: %@", error);
}else{ …Run Code Online (Sandbox Code Playgroud)