知道 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" 块中,每次保存完成后应该 运行。
我正在使用 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" 块中,每次保存完成后应该 运行。