gpt4 book ai didi

ios - 我无法使用非主 MOC 在后台线程上创建 NSManagedObject 的新实例

转载 作者:行者123 更新时间:2023-11-29 04:39:15 25 4
gpt4 key购买 nike

我在后台线程上研究了大量有关核心数据的帖子,我觉得我理解(在纸上)需要发生什么。我想我们会看到的。我正在努力将现有的 OS X 应用程序迁移到 Core Data,但在异步线程上创建 NSManagedObject 的新实例时遇到问题。

这是我在进入后台线程后立即运行的代码示例:

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 从后台线程的上下文中拉出。

最佳答案

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

我会为所有消息(名称:nil 对象:nil)注册一个 NSNotificationCenter 并打印它们。我打赌您会看到失败的状态更改或错误消息。

您可能想尝试围绕它的 @try/@catch block ,只是为了查看是否抛出异常。

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

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

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

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

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

关于ios - 我无法使用非主 MOC 在后台线程上创建 NSManagedObject 的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com