0

我研究了大量关于后台线程核心数据的帖子,我觉得我理解(在纸上)需要发生什么。我想我们会看到的。我正在将现有的 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 从后台线程的上下文中拉出。

4

1 回答 1

1

您将必须提供更多信息才能获得真正的帮助,但我敢打赌,您的问题是 NSManagedDocument 后台线程中发生的错误。

我会为所有消息(名称:nil object:nil)注册一个 NSNotificationCenter,然后将它们打印出来。我敢打赌,您会在那里看到失败的状态更改或错误消息。

您可能想在它周围尝试一个 @try/@catch 块,以查看是否抛出了异常。

也许它会给你更多的继续。

另一个建议... Swizzling 不一定是生产产品的正确工具,但它在调试方面几乎是无与伦比的。我已经对几个完整的类进行了方法转换,以便它在每次调用之前/之后发送详细的 NSNotification。

它为我节省了大量时间,并帮助我找到了一些邪恶的错误。现在,当 CoreData 中发生某些事情时,我取出我的一组类,将它们链接起来,然后查看我想要的所有细节。

我知道这并不能完全回答你的问题,但希望它能让你走上正轨,这样你就可以提供更多信息并解决所有问题。

如果这对您来说太多了,请创建一个子类并实例化它,并使用类似的方法调用 super。您可以很容易地了解整个流程。

于 2012-05-17T19:17:14.907 回答