我研究了大量关于后台线程核心数据的帖子,我觉得我理解(在纸上)需要发生什么。我想我们会看到的。我正在将现有的 OS X 应用程序迁移到 Core Data,并且NSManagedObject
在异步线程上创建 my 的新实例时遇到问题。
这是我在进入后台线程后立即运行的代码示例:
NSLog(@"JSON 1");
NSManagedObjectContext * context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[[NSApp delegate] persistentStoreCoordinator]];
asset = (MTAssetInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"Info" inManagedObjectContext:context];
NSLog(@"JSON 2");
结果是第一条日志消息(@"JSON 1")
被调用了 31 次,而第二条(@"JSON 2")
则从未被调用。该对象未正确制作和返回。
该Info
实体的模型非常复杂,有一些可转换的属性,这些属性可能设置正确,也可能不正确。奇怪的是,类似的代码在主线程上运行,而主 MOC 运行良好。没有问题。
编辑 - 更多上下文
异步调用来自这里:
for (NSNumber *sectionID in sectionsToShow) {
dispatch_group_async(group, queue, ^{
MTAssetInfo *asset = [self assetWithRefID:[sectionID unsignedIntegerValue]];
if (asset != nil) {
[sectionsLock lock];
[sectionsTemp addObject:asset];
[sectionsLock unlock];
}
});
}
由于其他代码片段,该assetWithRefID
方法永远不会返回对象。它永远不会成功地将 NSManagedObject 从后台线程的上下文中拉出。