我有一个使用NSManagedObjectContext副本在后台线程中运行的方法,该副本是在后台线程根据Apples建议启动时专门生成的。
在这个方法中,它调用一个类的共享实例,这个共享实例用于管理属性值。
托管属性的共享实例在主线程上使用NSManagedObjectContext,现在即使后台线程方法不应该在主线程上使用NSManagedObjectContext,共享属性管理器类是否执行或不执行也不重要使用这样的上下文,因为它只返回标量值回到后台线程(至少这是我的理解)。
那么,为什么在从后台线程调用时通过主线程上下文检索值时,共享属性类会挂起?它不需要传递NSManagedObject甚至更新一个,所以我看不出它会有什么不同。
我可以理解我的方法可能是错误的,但我想在基层了解为什么会这样。目前我无法理解整个系统足以能够超越苹果推荐的实施方法,这只是一种我不喜欢的黑魔法。
非常感谢任何帮助。
答案 0 :(得分:0)
使用:
[theContext performBlock:^{
// do stuff on the context's queue, launch asynchronously
}];
- 或 -
[theContext performBlockAndWait:^{
// do stuff on the context's queue, run synchronously
}];
- 为你工作?如果是这样,你就完成了。
如果没有,请仔细查看您的上下文如何设置,传递和使用。如果它们都共享根上下文,那么只要您在当前上下文中查找任何objectID,就应该能够轻松地在它们之间“移动”数据。
上下文绑定到线程/队列,基本上,所以总是使用给定的上下文作为工作的参考。 performBlock:
是实现此目的的一种方式。