好的,所以我有多个线程将持久存储(SQLite数据库)中的数据拉入单个NSManagedObjectContext(MOC)实例。我已经对它进行了相当彻底的测试,并且在操作重叠的情况下(线程4加载到MOC中,而线程5也是如此),一切都顺利进行。
我已阅读(大部分)核心数据编程指南,并且我知道Apple不会宽恕这种行为,但我想知道具体原因是什么。在文档中,Apple简要地提到了这样一个事实,即不仅写入是危险的,而且读取也是如此,因为可能会发生错误。如何(如果我从单独的线程加载的所有对象都是彼此没有重叠的单个实体)?这不仅仅意味着应用程序会受到性能影响吗?因此,如果我确定性能命中是一个比增加内存使用量更好的权衡,我倾向于使用一个MOC(非推荐)方法。
我将在任何情况下恢复推荐的方法,但我只是对如果不遵守这些规则可能发生的具体细节感到好奇。提前谢谢。
答案 0 :(得分:1)
我真的不知道,但是因为没有人回答。
非线程安全不是线程安全的。想象一下,Core Data程序员在NSManagedObjectContext numberOfObjectsLoaded
中放置了一些未暴露的实例变量。在线程A中,您可以访问托管对象foo.bar
的关系。在线程B中,您对一些完全不相关的对象baz.number = 14
进行了更改。 foo和baz都是错误的。他们被装上了。两个线程都尝试执行代码行
numberOfObjectsLoaded += 1
但是线程A读取numberOfObjectsLoaded,获取77,然后上下文切换。线程B也读取77,添加1,分配78.返回线程A.它添加1到77,它读取的内容为78,并且还为numberOfObjectsLoaded分配78。 numberOfObjectsLoaded应该有79,但有78.这种不一致将导致意外错误,并可能最终导致崩溃。它只会发生你运行程序的1/1000次,并且在实际错误发生几分钟之后可能没有什么不好的。很难调试。
遵循他们的建议,不要尝试。
答案 1 :(得分:0)
您是将对象拉出数据库,还是尝试访问属性?那就是故障得到处理......
很可能在某些时候,你的代码会崩溃。