cocoa - 如果我不在创建对象的线程上显式访问它们,那么操作在线程外部创建的对象是否安全?

标签 cocoa multithreading macos core-data

我正在开发一个 cocoa 软件,为了在大量数据导入(核心数据)期间保持 GUI 响应,我需要在主线程之外运行导入。

即使我在主线程中创建了这些对象而不使用锁,访问这些对象是否安全如果我在线程运行时没有显式访问这些对象。

最佳答案

使用 Core Data,您应该有一个单独的托管对象上下文用于导入线程,连接到相同的协调器和持久存储。您不能简单地将在主线程使用的上下文中创建的对象扔到另一个线程中并期望它们工作。此外,您不能为此进行自己的锁定;您必须至少根据需要锁定对象所在的托管对象上下文。但是,如果这些对象由您的 View 和控件绑定(bind)到,则没有可以添加上下文锁定的“钩子(Hook)”。

天下没有免费的午餐。

Ben Trumbull 在 this great post from late 2004 on the webobjects-dev list 中解释了为什么您需要使用单独的上下文的一些原因,以及为什么“仅阅读”并不像您想象的那么简单或安全。 。 (整个线程很棒。)他正在讨论企业对象框架和 WebObjects,但他的建议也完全适用于 Core Data。只需将消息正文中的“EC”替换为“NSManagedObjectContext”,将“EOF”替换为“Core Data”即可。

像之前的企业对象框架一样,Core Data 中线程之间共享数据问题的解决方案是“不要”。如果您进一步考虑过这一点,并且确实必须在线程之间共享数据,那么解决方案是将独立的对象图保留在线程隔离的上下文中,并使用来自一个上下文的保存通知中的信息来告诉其他上下文要重新获取什么。 -[NSManagedObjectContext refreshObject:mergeChanges:]是专门为支持这种用途而设计的。

关于cocoa - 如果我不在创建对象的线程上显式访问它们,那么操作在线程外部创建的对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67154/

相关文章:

c++ - 素数筛并不总能得到范围内的正确素数

java - 影响多线程操作系统的核心数量

objective-c - 如何在 Mac Os X 中向我的 cocoa 应用程序的屏幕添加信息

xml - Delphi XE2 中 'ADOM XML v4' 呈现的 WSDL XML

Java 类到 Objective-C 类

objective-c - (Mac) 创建执行 shell 脚本的 Xcode 应用程序

Android:将消息从后台线程传递到 UI 线程的正确方法?

c - 错误结果 : time(NULL) and clock()

objective-c - Cocoa,objective-c 如何调整 png 图像的大小?

cocoa NSView 未填充颜色