将对象从多个线程加载到一个托管对象上下文有什么问题?



好的,所以我有多个线程将数据从持久存储(SQLite数据库)拉到单个NSManagedObjectContext (MOC)实例中。我已经非常彻底地测试了它,在操作重叠的情况下(线程4加载到MOC,而线程5也这样做),一切都运行顺利。

我已经读了(大部分)核心数据编程指南,我知道苹果不容忍这种行为,但我想知道具体原因是什么。在文档中,苹果简要地暗示了这样一个事实,即不仅写操作是危险的,读操作也是危险的,因为可能会发生错误。如何(如果我从单独的线程加载的所有对象都是单独的实体,彼此没有重叠)?这是否意味着应用程序的性能会受到影响?因此,如果我确定性能下降比增加内存使用更好,我将倾向于使用一个MOC(不推荐)方法。

无论如何我都要恢复到推荐的方法,但我只是好奇如果不遵守这些规则会发生什么具体细节。

我真的不知道,但是因为还没有人回答。

非线程安全就是不线程安全。想象一下Core Data程序员在NSManagedObjectContext numberOfObjectsLoaded中放置一些未公开的实例变量。在线程A中,您访问一个托管对象foo.bar的关系。在线程B中,您对一些完全不相关的对象baz.number = 14进行了更改。foo和baz都是错误。他们很有钱。两个线程都尝试执行

这行代码
numberOfObjectsLoaded += 1

但是线程A读取numberofobjectloaded,得到77,然后上下文切换。线程B也读取77,加1,赋值78。回到线程a,它把1加到77上,这是它读到的,得到78,并把78赋值给numberofobjectloaded。numberofobjectloaded应该有79,但是有78。这种不一致将导致意想不到的错误,并可能最终导致崩溃。它只会在您运行程序的1/1000次中发生,并且可能在实际错误发生几分钟后才会出现明显的错误。很难调试

听从他们的建议,不要尝试。

您是否将对象从数据库中取出,或者您是否还尝试访问属性?这就是处理错误的时候……

你的代码很可能在某个时候崩溃。

最新更新