Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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
Ios 核心数据唯一性约束-“;对无效对象的悬空引用";保存_Ios_Cocoa Touch_Core Data - Fatal编程技术网

Ios 核心数据唯一性约束-“;对无效对象的悬空引用";保存

Ios 核心数据唯一性约束-“;对无效对象的悬空引用";保存,ios,cocoa-touch,core-data,Ios,Cocoa Touch,Core Data,我在一个新的模型版本中为现有应用引入了独特的约束 该模型具有实体Person,该实体Person与实体Pet具有可选的一对一关系。个人的删除规则为级联,宠物的反向关系删除规则为空。还有另一个实体,工作,这个人也有一对一的关系。但删除规则和反向删除规则都是无效的 这个人有一个“人格”属性,这是我做的独一无二的 在主队列上下文中,我有一个ID为xxx的Person实例,它没有Pet集。让我们叫那个人“查理”。我还创建了一个作业,并将其设置为“iOS-Dev”,并将其分配给Charlie的作业属性 然

我在一个新的模型版本中为现有应用引入了独特的约束

该模型具有实体Person,该实体Person与实体Pet具有可选的一对一关系。个人的删除规则为级联,宠物的反向关系删除规则为空。还有另一个实体,工作,这个人也有一对一的关系。但删除规则和反向删除规则都是无效的

这个人有一个“人格”属性,这是我做的独一无二的

在主队列上下文中,我有一个ID为xxx的Person实例,它没有Pet集。让我们叫那个人“查理”。我还创建了一个作业,并将其设置为“iOS-Dev”,并将其分配给Charlie的作业属性

然后在子专用队列上下文中,我插入一个新的“Charlie”,它也具有ID xxx(唯一约束),并创建一个Pet并设置它。我没有设定工作。我保存的子上下文没有问题

紧接着,我尝试保存主队列上下文。但就在这之前,我检查了主队列上下文的insertedObjects属性,并看到了一个ID为xxx的Person实例。我所期望的是,第二个实例将由唯一的约束处理,并与上一段中Person的原始实例“合并”。但是,当我实际调用MOC的save:方法时,它会抛出一个异常,我会检查NSError对象:

错误域=NSCOCAERRORDOMAIN Code=1550“无法执行该操作 已完成。(Cocoa错误1550。)“UserInfo={挂起对 无效对象。=空

有没有关于如何避免异常的想法?我习惯于在核心数据中“挂起引用”,这意味着关系被错误配置,但我已经检查了很多次,而且看起来很好,所以我不确定还有什么问题需要解决。我有使用NSMergeByPropertyObject TrumpMergePolicy合并策略的所有上下文


显然,这有点难以理解,因此我在Github上抛出了一个示例项目,以防有人感兴趣:

如果您想采用新的iOS 9独特约束策略,您必须确保两个上下文具有相同的合并策略集

请注意,如果对象的较新实例的属性/关系为
nil
,并且您的意图是始终“增加”对象,即填充任何缺少的属性并更新现有属性,则这将不会对您有所帮助

否则,对于iOS9之前的版本,以下内容有效

可能对您使用的合并策略的含义有一些误解(
NSMergeByPropertyObject TrumpMergePolicy
)。它指的是一个对象的一个版本在内存中,另一个版本在持久存储中,而不是在不同上下文中的两个版本在内存中。从头文件:

此单例策略合并持久存储区的对象版本和当前内存版本之间的冲突

因此,创建新对象的过程不是正确的方法

相反,您应该使用唯一ID在子上下文中获取
Person


或者,您可以将此人的
对象ID
(一个不透明的核心数据工件)可供子上下文使用
objectWithID:

获取对对象图中相同对象的引用,我为此烧掉了一张代码级支持票,一位苹果工程师确认存在错误。作为一种解决方法,建议编写自己的合并策略,调用super,然后手动确保关系在两端设置。

使用后台上下文中的did save通知将更改合并到主上下文中。请参见示例。

但我认为iOS 9中唯一约束的全部目的是不必“获取或创建”这类事情?我这样做是为了避免在另一个线程中创建重复的记录,我认为这是唯一约束应该帮助解决的问题之一。好的-我知道你是从哪里来的。你需要在两个上下文中设置合并策略,否则它将不起作用。我仍然更喜欢在同一个托管对象上工作ject,而不是依赖一个相当不透明的合并策略(因为它更显式和可调试),但你的方法也应该有效。它应该有效!我正在为这里涉及的所有上下文设置合并策略。我很确定这是一个苹果漏洞,但会进行调查。我认为你应该接受我的建议。如果你问我,这是一个懒惰的黑客,而且最好是显式更新或创建。此外,我认为我不知道d您的安装程序无法运行的原因。请查看我答案的第二段。在我的情况下,升级到Xcode 8.2使问题消失了!这很好。在我的应用程序中,我发现编写自己的合并策略并不能解决问题,所以我实际上不再依赖独特的功能,这意味着大量额外的创建或u更新代码,还需要对保存到核心数据的操作进行排队。希望在某个时候我可以再次访问。我不得不收回10月29日发表的令人高兴的评论——这一问题已经卷土重来,我现在相信1550悬挂参考错误似乎消失了,因为我已经重置了simul上的内容在我的例子中,当我的内容从服务器刷新并且我的应用程序尝试更新核心数据中的现有对象时,我得到了1550。我现在使用的是8.2版,并且仍然试图解决我的问题,假设这仍然不是因为Xcode中的错误。