具有多个后台线程的核心数据

时间:2012-03-02 14:57:48

标签: objective-c multithreading core-data nsmanagedobjectcontext

我有一个使用Core Data的iphone / ipad应用程序。 数据通过各种Web服务调用提供。 我使用轮询机制来确定何时彼此独立地进行每个服务调用,以便使信息保持最新。 因此,很可能有多个后台线程使用多个MOC处理来自这些调用的数据。对于插入和更新,此方法可以正常工作。 在尝试实现删除功能时,我的程序崩溃了。这似乎是在一个线程中的上下文删除另一个线程也在使用的托管对象时引起的,因为删除的对象已经出现故障。

我一直在网上寻找解决方案,但没有得到任何具体的解决方案。 删除是否应该推送到主线程的上下文?如何在Singleton中维护单个线程并附带MOC来进行所有处理?

非常感谢任何帮助/指导。

2 个答案:

答案 0 :(得分:2)

我发现在并发访问同一个应用程序的各个部分之间共享的一组数据的情况下,在实际删除它们之前将标记对象作为过时使用会很有用。

这样可以更轻松地捕获对过时数据的请求并做出适当的响应。

通常我会有一些处理所有访问的数据管理器单例类。该标志可以是实体的时间戳属性,标记对该对象的最后访问。标记对象的实际删除发生时没有其他请求在队列中,并且对象在一段时间内没有被使用。

根据数据的类型和数量以及更改的频率,这种方法可能需要改进。

答案 1 :(得分:1)

  

我一直在网上搜索解决方案,但没有特别提到任何问题。

您是否尝试过Apple在Core Data Programming Guide中建议的所有内容?在没有看到您的代码的情况下,在我看来,您缺少的是NSManagedObjectContextDidSaveNotification部分。每个线程都必须注册其他线程上的MOC保存。这意味着线程必须都有一个运行循环。

总的来说,这看起来有点凌乱。我想我会改变架构,在主线程上进行所有Core Data更改(而不仅仅是删除)。