Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Iphone 什么';从多个线程将对象加载到一个托管对象上下文中有什么问题?_Iphone_Objective C_Multithreading_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

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

Iphone 什么';从多个线程将对象加载到一个托管对象上下文中有什么问题?,iphone,objective-c,multithreading,core-data,nsmanagedobjectcontext,Iphone,Objective C,Multithreading,Core Data,Nsmanagedobjectcontext,好的,我让多个线程将数据从持久存储(SQLite数据库)拉入单个NSManagedObjectContext(MOC)实例。我已经对它进行了非常彻底的测试,在操作重叠的情况下(线程4加载到MOC中,而线程5也加载到MOC中),一切都运行顺利 我已经阅读了(大部分)核心数据编程指南,并意识到苹果并不宽恕这种行为,但我想知道具体原因是什么。在文档中,苹果公司简要地暗示了这样一个事实:不仅写操作是危险的,而且读操作也是危险的,因为可能会发生错误。如何(如果我从单独的线程加载的所有对象都是彼此不重叠的单

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

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


在任何情况下,我都会回到推荐的方法,但我只是想知道如果不遵守这些规则会发生什么的具体细节。提前谢谢。

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

不线程安全就是不线程安全。假设核心数据程序员将一些未公开的实例变量放入NSManagedObjectContext
numberOfObjectsLoaded
。在线程A中,访问托管对象的关系,
foo.bar
。在线程B中,您对一些完全无关的对象进行更改
baz.number=14
。foo和baz都是故障。他们会上膛。两个线程都尝试执行代码行

numberOfObjectsLoaded += 1
但是线程A读取numberOfObjectsLoaded,得到77,然后进行上下文切换。线程B也读取77,添加1,分配78。回到线程A。它将1和77相加,即它读取的值,得到78,并将78赋值给numberOfObjectsLoaded。numberOfObjectsLoaded应该有79个,但有78个。这种不一致性将导致意外错误,并可能最终导致崩溃。它只会发生在你运行你的程序的1000次中的1次,并且在实际错误发生几分钟之前,可能不会有什么不好的事情发生。很难调试


遵循他们的建议,不要尝试。

您是将对象从数据库中拉出,还是也尝试访问属性?这就是错误被处理的时候


很可能在某个时候,您的代码会崩溃。

我拉出NSManagedObjects并将它们放入容器类中,然后访问对象的属性。你为什么说我的代码会崩溃?我的印象是(从我对故障的相对初步理解来看),故障会导致性能下降,而不是崩溃。访问后台线程上的属性会导致崩溃,很可能只是使用主线程的上下文在其他线程上创建对象时崩溃。仅仅因为你现在不能让它崩溃并不意味着数百万人以后会看到崩溃……你是说:“……不意味着数百万人以后不会看到崩溃……”?谢谢。好的,你的解释很有道理。是的,如上所述,我正在将所有内容更改回正确的实现,而不管这里收到的答案是什么。谢谢