Core data &引用;错误:此进程调用了一个NSArray获取方法…”;当iCloud推送托管对象时

Core data &引用;错误:此进程调用了一个NSArray获取方法…”;当iCloud推送托管对象时,core-data,ios8,icloud,nsmanagedobject,nsset,Core Data,Ios8,Icloud,Nsmanagedobject,Nsset,对于通过iCloud update发送的每个托管对象,此警告/错误将发送到控制台: ***错误:此进程调用了NSArray获取方法,例如 initWithArray:,并传入NSSet对象。这是 现在已经工作了,但很快会让你悲伤 我的托管对象是客户端,与评估有一对多关系,如下所示 class Client: NSManagedObject { //other NSManaged vars are here @NSManaged var assessme

对于通过iCloud update发送的每个托管对象,此警告/错误将发送到控制台:

***错误:此进程调用了NSArray获取方法,例如 initWithArray:,并传入NSSet对象。这是 现在已经工作了,但很快会让你悲伤

我的托管对象是客户端,与评估有一对多关系,如下所示

    class Client: NSManagedObject {

        //other NSManaged vars are here

        @NSManaged var assessment: NSOrderedSet
}
根据此错误的时间安排(在无处不在的更新期间)以及这是我在项目中唯一使用NSSet对象的事实判断,我可以假定,在更新期间,当函数需要NSArray时,正在向NSOrderedSet传递函数

关闭iCloud将删除错误

我发现另外两个人也有类似的问题:

然而,这两种方法都不能解决我的问题。现在一切正常,但“很快就会让你悲伤。”


如果这个问题在这里没有得到解决,我将与苹果开发人员支持部门讨论这个问题。

经过大量研究,我找到了解决这个错误的方法。(在Apple开发论坛上没有任何帮助)

这是由Swift 1.2升级导致的错误。他们鼓励您使用新的Set类而不是NSSet。这一错误只是一种模糊的方式来强化这种说法

数据的排序最终由NSFetchedResultsController处理,因此我不需要对存储的数据进行排序。因此,我开始执行一项任务,将一对多关系的数据类型从一个数据集更改为另一个数据集

因此,我创建了一个新的数据模型,选择了我的关系,并在数据模型检查器中取消选中“Ordered”。然后在下一次运行中迁移到新模型。(如下图所示)

完成后,我将托管对象子类中的数据类型从NSOrderedSet更改为Set。(或设置)。这就产生了编译器错误,在我的代码中很容易修复

新的Set类很容易转换为数组:
array(mySet)

要向集合中插入对象,有一种简单的插入方法
foo.mySet.insert(objectToInsert)

旁注:将关系转换为集合还修复了我在表视图和NSFetchedResultsController中遇到的一些奇怪的排序问题

然后我运行程序,生成数据,卸载程序。再次运行该程序,观看华丽的iCloud数据填充,没有令人讨厌的错误

轰。我希望这能帮别人省去10个小时的混乱(我尝试了很多不同的东西…),我花了10个小时来解决这个问题