从后台线程从主线程managedobjectcontext请求标量值

时间:2014-02-20 18:51:02

标签: ios objective-c multithreading

我有一个使用NSManagedObjectContext副本在后台线程中运行的方法,该副本是在后台线程根据Apples建议启动时专门生成的。

在这个方法中,它调用一个类的共享实例,这个共享实例用于管理属性值。

托管属性的共享实例在主线程上使用NSManagedObjectContext,现在即使后台线程方法不应该在主线程上使用NSManagedObjectContext,共享属性管理器类是否执行或不执行也不重要使用这样的上下文,因为它只返回标量值回到后台线程(至少这是我的理解)。

那么,为什么在从后台线程调用时通过主线程上下文检索值时,共享属性类会挂起?它不需要传递NSManagedObject甚至更新一个,所以我看不出它会有什么不同。

我可以理解我的方法可能是错误的,但我想在基层了解为什么会这样。目前我无法理解整个系统足以能够超越苹果推荐的实施方法,这只是一种我不喜欢的黑魔法。

非常感谢任何帮助。

1 个答案:

答案 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:是实现此目的的一种方式。