【问题标题】:Know when Core Data has saved all entities using NSXMLParser知道 Core Data 何时使用 NSXMLParser 保存了所有实体
【发布时间】:2018-04-11 22:47:18
【问题描述】:

我正在使用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

想法?

【问题讨论】:

    标签: ios objective-c core-data nsxmlparser


    【解决方案1】:

    一种明显的方法是将performBlock 替换为performBlockAndWait,这样您就可以在块完成后知道保存也完成了。

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

    • 使用dispatch_group_create 创建一个调度组
    • 每次启动其中一个块时,请先致电dispatch_group_enter,然后再执行其他任何操作。
    • 每次保存完成时,调用dispatch_group_leave
    • 使用dispatch_group_notify 安排一个只有在每个“进入”都与“离开”匹配时才会执行的块。

    将代码放在每次保存完成后应该运行的“通知”块中。

    【讨论】:

    • 我经常使用调度组模式,但是对于这种情况,我想知道如果在解析 xml 对象之后调用 dispatch_group_enter 然后在另一个 @987654328 之前非常快速地保存它会如何工作@ 已创建。因此可以调用dispatch_group_notify。我错了吗?
    • 刚刚对此进行了测试,它确实立即触发了dispatch_group_notify。还有其他想法吗?
    • 是的——在你开始这个过程之前添加一个“输入”。在parserDidEndDocument 中添加“离开”。那么你不能在解析器完成之前调用通知块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2011-12-24
    • 2012-07-19
    相关资源
    最近更新 更多