Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 其他线程可以间接访问自己线程中运行的托管对象上下文吗?_Multithreading_Cocoa_Core Data_Cocoa Bindings_Cocoa Design Patterns - Fatal编程技术网

Multithreading 其他线程可以间接访问自己线程中运行的托管对象上下文吗?

Multithreading 其他线程可以间接访问自己线程中运行的托管对象上下文吗?,multithreading,cocoa,core-data,cocoa-bindings,cocoa-design-patterns,Multithreading,Cocoa,Core Data,Cocoa Bindings,Cocoa Design Patterns,Apple推荐的多线程核心数据处理方法是,每个线程使用托管对象上下文,并通过将更改后的线程上下文保存到共享持久存储区,将更改从一个上下文发送到另一个上下文 虽然我可以想象,对于一些应用程序来说,例如RSS阅读器,这似乎远远不够理想。在我的例子中,我正在编写一个音乐序列器,它使用背景线程记录和播放数据。我需要在录制/回放期间主线程可以访问录制的数据。录制/播放时必须不断保存和加载数据已经够糟糕的了,但更糟糕的是,这似乎会迫使用户在录制或播放时保存数据,这有点叫“糟糕的应用程序” 然而,似乎有一种方

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

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

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

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


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

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

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



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

谢谢。我想我的想法是有几个线程发送performSelector:onThread。。。对于NSManagedObject,它将读/写消息放入队列,这(我希望)为我们免费提供优化的缓冲区和队列。无论NSManagedObject在内部做什么,它都不会运行accessor#2,直到它使用accessor#1完成,对吗?