3

Apple 推荐的多线程核心数据方法是为每个线程使用一个托管对象上下文,并通过将更改的线程的上下文保存到共享持久存储来将更改从一个上下文发送到另一个上下文。

虽然我可以想象这对例如很好。一个 RSS 阅读器,对于某些应用程序来说,它似乎远非理想。就我而言,我正在编写一个使用后台线程记录和播放数据的音乐音序器。我需要在录制/播放期间主线程可以访问录制的数据。在录制/播放时必须不断地保存和加载数据已经够糟糕了,但更糟糕的是,它似乎会迫使用户在录制或播放时进行保存,这有点尖叫“糟糕的应用程序”。

但是,似乎有一种方法可以回避这一点。如果其他线程不需要访问核心数据实体本身(只是它们包含的数据),那么阻止我在自己的线程中运行托管对象上下文,并且只允许其他线程间接访问,例如通过绑定 UI对象到调用performSelector:onThread:withObject:waitUntilDone:托管对象上下文的线程以获取/设置值的属性?

它没有提供多线程的一些好处(即,将核心数据扩展到多核 CPU),但很多时候,我们只是希望多线程避免在发生密集事件时锁定 UI。

我还没有看到这种模式提倡核心数据。考虑到当你不完全按照苹果的建议去做时,它可能是一个奇怪且不可预测的野兽,我认为这是否真的避免了我们不鼓励让多个线程访问单个托管对象上下文的原因是值得的.

4

1 回答 1

2

您无法控制 NSManagedObject 内部的实现细节,更具体地说,当您读取属性时,CoreData 可能需要在上下文中执行某些操作是有原因的。

对于您的特定需求,我建议您使用基于高度优化的隔离、缓冲区和队列的解决方案,在该解决方案中,您可以在将 CD 对象传递给后台处理线程之前复制所需的内容。


如果需要,您可以使用 performSelector:on*Thread:,但随后您将处理同步问题、延迟和其他有趣的并发问题。就个人而言,我会采用上述排队机制。

于 2010-10-01T00:50:34.323 回答