gpt4 book ai didi

core-data - iCloud 推送托管对象时为 "Error: this process has called an NSArray-taking method..."

转载 作者:行者123 更新时间:2023-12-02 03:48:35 25 4
gpt4 key购买 nike

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

*** 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 对象的事实来判断,我可以假设此更新期间的函数在需要 NSArray 时正在传递 NSOrderedSet .

关闭 iCloud 可以消除错误。

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

Core Data Relation between Objects

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

如果此处未解决此问题,我将向 Apple 开发人员支持解决此问题。

最佳答案

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

此错误是由 Swift 1.2 升级引起的。他们鼓励您使用他们的新 Set<> 类而不是 NSSet。这个错误是一种模糊的方式来强化这一说法。

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

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

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

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

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

旁注:将我的关系转换为 Set 还解决了我在 TableView 和 NSFetchedResultsController 中遇到的一些奇怪的排序问题。

然后我运行程序,生成数据,卸载程序。再次运行该程序,观察精彩的 iCloud 数据填充,而不会出现恼人的错误。

繁荣。我希望这可以帮助其他人免去 10 个小时的困惑(我尝试了很多不同的事情..),我花了很多时间来解决这个问题。

关于core-data - iCloud 推送托管对象时为 "Error: this process has called an NSArray-taking method...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29932892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com