我正在从后台队列创建许多托管对象并将其添加到 Core Data。我的理解是我无法从后台线程访问上下文,因此我使用 performBlock 来安排将 Core Data 添加回创建上下文的同一队列中。这工作得很好......
我的问题是在测试期间我注意到通过删除[moc performBlock:^{ ... }];
应用程序仍然可以按预期执行(甚至可能快几分之一秒)我需要performBlock
吗?我会假设我这样做并且它只是以非线程安全的方式工作(目前:),我只是想检查以确保我的理解没有缺陷。
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(backgroundQueue, ^{
// GET DATA
// PROCESS DATA
NSManagedObjectContext *context = [[self managedDocument] managedObjectContext];
[moc performBlock:^{
// ADD TO CORE DATA
[Core createRodInContext:context withDictionary:fuelRodDictionary];
}];
});
编辑:为 createRodInContext 添加了实现 ...
+ (Rod *)createRodInContext:(NSManagedObjectContext *)context withDictionary:(NSDictionary *)dictionary {
// CREATE
Rod *rod = [NSEntityDescription insertNewObjectForEntityForName:@"Rod" inManagedObjectContext:context];
// POPULATE
[neo setDataCode:[dictionary objectForKey:@"dataCode"]];
[neo setDataName:[dictionary objectForKey:@"dataName"]];
[neo setDataReference:[dictionary objectForKey:@"dataReference"]];
...
return rod;
}