知道 Core Data 何时使用 NSXMLParser 保存了所有实体

Know when Core Data has saved all entities using NSXMLParser

我正在使用 NSXMLParser 读取大型 XML 文件。获得所需的数据元素后,我将创建一个 NSManagedObject 并将其保存在背景上下文中。导入的文件将有 n 个导入项目,永远不知道。

NSManagedObjectContext *backgroundContext = [ZSSCoreDataManager sharedService].persistentContainer.newBackgroundContext;
[backgroundContext performBlock:^{

    // Create and insert new entity here
    [self createAndInsertWithDictionary:object];

    // Save
    if ([backgroundContext hasChanges]) {
        NSError *error = nil;
        if (![backgroundContext save:&error]) {

            NSLog(@"%@", error);

        }

        // Save was successful, reset to release memory
        [backgroundContext reset];

    }

}];

因为解析的速度可能比 save: 完成的速度快,我如何才能知道 XML 文件何时完成读取以及我所有的 Core Data 对象是否已完成保存?我知道 parserDidEndDocument: 方法,但这无助于知道我的所有对象何时完成保存到 Core Data

想法?

一个明显的方法是将 performBlock 替换为 performBlockAndWait,这样您就知道一旦块完成,保存也已完成。

如果你不想等,这听起来像是派遣组的工作。这将允许安排一个函数仅在一堆异步代码完成后才被调用。

  • 创建调度组dispatch_group_create
  • 每次启动这些块之一时,请先调用 dispatch_group_enter,然后再进行其他操作。
  • 每次保存完成,调用dispatch_group_leave
  • 使用dispatch_group_notify安排一个块,只有当每个"enter"都被"leave"匹配时才会执行。

将代码放在 "notify" 块中,每次保存完成后应该 运行。