我正在使用 NSXMLParser 处理需要在我的核心数据模型中结束的大型复杂 XML 文件。为此,我遵循 Conway 和 Hillegass 在 iOS 书中讨论的设计模式,每次到达新节点并动态创建新节点时,都会更改 NSXMLParser 的委托。为了创建实体,我MR_createEntity
在解析过程中为每个新节点使用 MagicalRecord 来设置我的数据模型。解析完成后我打电话
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
将新实体保存到我的核心数据存储中。
这一切都很好,直到我最近决定将解析移到后台线程中。而且我注意到 XML 数据并不总是被导入。所以经过一些谷歌搜索后,我发现MR_createEntity
不应该在后台线程上使用它(链接:https ://github.com/magicalpanda/MagicalRecord/issues/298 )。
那么该怎么办?我看到两种可能的解决方案:
在解析过程中,只需创建一个基于 Foundation 的所有节点结构,NSDictionaries 和 NSArrays 的混合。这可以在后台线程上完成。完成后,我返回主线程并使用
MR_importValuesForKeysWithObject
或类似的方法将数据保存到 Core Data 中(如此处所述:http ://www.cimgf.com/2012/05/29/importing-data-made-easy/ )。但这适用于深度嵌套的字典和数组的组合吗?在解析期间
MR_CreateEntity
,我使用而不是调用[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) { MyEntity *entity = [MyEntity MR_createInContext:localContext]; }];
每次我遇到上面 github 链接中建议的新节点时。
所以在我开始切割和修改我的代码之前,我该怎么做?也许还有另一种方法?