"Error: this process has called an NSArray-taking method..." when iCloud pushes managed objects

"Error: this process has called an NSArray-taking method..." when iCloud pushes managed objects

对于通过 iCloud 更新发送的每个托管对象,此 warning/error 被发送到控制台:

*** ERROR: this process has called an NSArray-taking method, such as initWithArray:, and passed in an NSSet object. This is being worked-around for now, but will soon cause you grief.

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

    class Client: NSManagedObject {

        //other NSManaged vars are here

        @NSManaged var assessment: NSOrderedSet
}

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

关闭 iCloud 会消除错误。

我发现另外两个人也有非常相似的问题:

Core Data Relation between Objects

但是,两者都没有提供任何解决我的问题的方法。现在一切正常,但是 "it will soon cause you grief."

如果这里没有解决这个问题,我会通过 apple 开发支持解决这个问题。

经过大量研究,我找到了解决此错误的方法。 (没有来自 Apple Dev 论坛的帮助)。

此错误是由 Swift 1.2 升级引起的。他们鼓励您使用他们的新 Set<> class 而不是 NSSet。该错误是强化该声明的模糊方式。

我的数据排序最终由我的 NSFetchedResultsController 处理,所以我不需要对存储的数据进行排序。因此,我着手一项任务,将我的一对多关系的数据类型从 NSOrderedSet 更改为 Set。

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

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

新的 Set class 轻松转换为数组:Array(mySet)

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

旁注:将我的关系转换为 Set 还解决了我在使用 table 视图和 NSFetchedResultsController 时遇到的一些奇怪的排序问题。

然后我运行程序,生成数据,卸载程序。 运行 再次运行该程序并观看出色的 iCloud 数据填充而没有烦人的错误。

繁荣。我希望这可以节省 10 个小时的混乱(我尝试了很多不同的东西..)我花了很多时间来解决这个问题。