0

我正在使用 NSXMLParser 处理需要在我的核心数据模型中结束的大型复杂 XML 文件。为此,我遵循 Conway 和 Hillegass 在 iOS 书中讨论的设计模式,每次到达新节点并动态创建新节点时,都会更改 NSXMLParser 的委托。为了创建实体,我MR_createEntity在解析过程中为每个新节点使用 MagicalRecord 来设置我的数据模型。解析完成后我打电话

[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; 

将新实体保存到我的核心数据存储中。

这一切都很好,直到我最近决定将解析移到后台线程中。而且我注意到 XML 数据并不总是被导入。所以经过一些谷歌搜索后,我发现MR_createEntity不应该在后台线程上使用它(链接:https ://github.com/magicalpanda/MagicalRecord/issues/298 )。

那么该怎么办?我看到两种可能的解决方案:

  1. 在解析过程中,只需创建一个基于 Foundation 的所有节点结构,NSDictionaries 和 NSArrays 的混合。这可以在后台线程上完成。完成后,我返回主线程并使用MR_importValuesForKeysWithObject或类似的方法将数据保存到 Core Data 中(如此处所述:http ://www.cimgf.com/2012/05/29/importing-data-made-easy/ )。但这适用于深度嵌套的字典和数组的组合吗?

  2. 在解析期间MR_CreateEntity,我使用而不是调用

    [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext)
    {
        MyEntity *entity = [MyEntity MR_createInContext:localContext];
    }];
    

每次我遇到上面 github 链接中建议的新节点时。

所以在我开始切割和修改我的代码之前,我该怎么做?也许还有另一种方法?

4

2 回答 2

1

如果我正确理解了 MagicalRecord 源代码,您只需要一个调用 saveInBackgroundWithBlock:completion:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
      // ... parse XML ...
      // ... create entities with:
      MyEntity *entity = [MyEntity MR_createInContext:localContext];
      // ...
} completion:^{
    NSLog("Import finished");
}];

这个

  • 创建一个临时的背景上下文,
  • 执行与该上下文关联的后台队列上的第一个块,
  • 调用MR_saveToPersistentStoreAndWait将临时上下文保存到主上下文并将主上下文保存到持久核心,
  • 最后执行完成块。
于 2013-08-31T02:23:32.740 回答
0

你试试这个? https://stackoverflow.com/a/13924299/1979953

像这样。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  // dispatch_async mean your NSXMLParser in a backgound thread
  MyEntity *entity = [MyEntity MR_createEntity];

  ...

  [[NSManagedObjectContext MR_contextForCurrentThread] saveNestedContexts];
});

但是,您发现不应在后台线程上使用 MR_createEntity。所以我很困惑。

于 2013-09-01T00:56:09.730 回答