【问题标题】:"Error: this process has called an NSArray-taking method..." when iCloud pushes managed objects“错误:这个过程调用了一个 NSArray-taking 方法......”当 iCloud 推送托管对象时
【发布时间】:2015-07-08 02:22:37
【问题描述】:

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

*** 错误:这个进程调用了一个 NSArray-taking 方法,比如 initWithArray:,并传入一个 NSSet 对象。这正在 暂时可以解决,但很快就会让你伤心。

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

    class Client: NSManagedObject {

        //other NSManaged vars are here

        @NSManaged var assessment: NSOrderedSet
}

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

关闭 iCloud 可消除错误。

我发现另外两个人有一个非常相似的问题: Using iCloud enabled Core Data NSArray-taking method

Core Data Relation between Objects

但是,两者都没有为我的问题提供任何解决方案。现在一切正常,但是“它很快就会让你伤心。”

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

【问题讨论】:

    标签: core-data ios8 icloud nsmanagedobject nsset


    【解决方案1】:

    经过大量研究,我想出了如何解决此错误。 (没有来自 Apple Dev 论坛的帮助)。

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多