"错误:当iCloud推送托管对象时,此过程调用了一个NSArray-taking方法......"

Gar*_*ret 3 core-data nsset nsmanagedobject icloud ios8

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

***错误:此进程调用了一个NSArray-taking方法,例如initWithArray:,并传入一个NSSet对象.现在正在解决这个问题,但很快就会让你感到悲痛.

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

    class Client: NSManagedObject {

        //other NSManaged vars are here

        @NSManaged var assessment: NSOrderedSet
}
Run Code Online (Sandbox Code Playgroud)

从这个错误的时间(在无处不在的更新期间)以及这是我在项目中唯一使用NSSet对象的事实来判断,我可以假设在更新期间,当一个函数在期望NSArray时传递一个NSOrderedSet.

关闭iCloud可以消除错误.

我发现另外两个人有一个非常相似的问题: 使用iCloud启用Core Data NSArray-taking方法

对象之间的核心数据关系

但是,它们都没有为我的问题提供任何解决方 现在一切都很好,但"很快就会让你感到悲伤."

如果这里没有解决,我将把这个问题与苹果开发支持联系起来.

Gar*_*ret 6

经过多次研究后,我想出了如何解决这个错误.(Apple Dev论坛没有帮助).

这是错误是由Swift 1.2升级引起的.他们鼓励您使用新的Set <>类而不是NSSet.错误是加强这种主张的模糊方式.

我的数据的排序最终由我的NSFetchedResultsController处理,所以我不需要订购存储的数据.所以我开始着手改变从NSOrderedSet到Set的一对多关系的数据类型.

所以我创建了一个新的数据模型,选择了我的关系并在数据模型检查器中取消选中"Ordered".然后在下次运行中迁移到新模型.(如下所示)在此输入图像描述

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

新的Set类可以轻松转换为数组: Array(mySet)

要将对象插入到集合中,可以使用简单的插入方法. foo.mySet.insert(objectToInsert).

旁注:将我的关系转换为Set也修复了我的表视图和NSFetchedResultsController的一些奇怪的排序问题.

然后我运行程序,生成数据,卸载程序.再次运行该程序,观看光荣的iCloud数据填充,没有恼人的错误.

繁荣.我希望这能节省10个小时的动荡(我尝试了很多不同的事情......)我花了很多时间来解决这个问题.