swift - 如何使用NSPersistentCloudKitContainer设置有序关系?

标签 swift core-data xcode11 nspersistentcloudkitcontainer

当我检查Used with CloudKit时,出现了Folder.children must not be ordered错误。关于有秩序的关系有什么想法吗?

IDE:Xcode11 beta3

enter image description here

这是Folder实体。

enter image description here

最佳答案

(适用于:自iOS 13起,以及14的早期Beta版)
云工具包不能使用有序关系(由于有序数据是存在的基本内容,因此会很困难)。原因是,所有内容都由CKRecord(云工具包记录)支持,而不是实际的核心数据;这是一种完全不同的数据存储类型,PersistentCloudKitContainer正在将您的数据实时重写到CKRecords并返回。 CKRecords没有一种机制可以像我们在Core Data的有序关系中那样维护有序项目的日记帐。
这意味着它不太可能在短期内“修复”,因为通常需要对CloudKit和苹果的iCloud进行更改(而对CoreData进行更改)。
所以...
您有一些不好的选择:

  • 没有正式的关系-而是有一个存储字段的地方,例如引用列表。添加/删除子对象时,请自己维护。父记录中基本上有一个“admin”字段,可用于维护自己的“关系”机制。 (例如:为每个 child 生成一个UUID, parent 为所有 child 存储一个串联的UUID列表)
  • 使用CoreData Relationships,并将订购数据存储在子对象中,例如您手动维护的orderIndex int字段。
  • 混合:使用父级与子级之间的无序关系,并在父级中存储“子级”字段。 CoreData管理关系,您可以根据需要手动维护和应用这些子项的排序。

  • 无论您做什么,都是不好的:
  • 没有关系:没有“获取 parent ”,并通过关系获得对 child 的引用;您必须分别获取两者。也没有为您完成“删除”规则,例如“在删除父级时,级联删除子级。”当您需要多个集合中的 child 时,此方法将起作用(因为每个集合记录都保留了自己的 child 列表)
  • 子对象中的排序(这是我使用的):您必须在子对象的每个添加和删除操作中插入自己,并运行代码来调整所有子对象的orderIndex值。我通过具有CoreDataManager.createChild(atIndex :),CoreDataManager.deleteChild()和CoreDataManager.moveChild(toIndex :)函数来管理此问题,这些函数具有更新orderIndex值的副作用。但是至少您会得到“获取父对象;对于parent.children中的c,则...”,然后级联删除操作。但是:由于子项只有一个orderIndex值,因此子项只能在一个父项的列表中。
  • 关系+父级中手动维护的排序字段:让核心数据管理关联,当需要有序的子级时,可以使用parent.orderedChildren()函数来读取父级的.childOrder字段,并将其应用于.children列表。但是...您仍然必须手动管理父级的.childOrder字段,并在每次添加/删除/重新排序子级时对其进行更改。但是,使用Cloud Sync,随着在不同应用程序实例中添加/删除子项时,.child列表和.childOrder字段值不同步的情况可能存在许多潜在的错误。将子列表和排序保持独立意味着可以通过云同步分别更新它们。
  • 关于swift - 如何使用NSPersistentCloudKitContainer设置有序关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56967051/

    相关文章:

    iphone - 当上下文保存在核心数据中时,如何更改实体?

    ios - controllerDidChangeContent 核心数据严重应用错误

    ios - SwiftUI 和 UIKit 与旧 API 中的 UIViewController 要求交互

    swift - 在 UIPageControl 旁边的 UILabel 上点击手势不起作用

    c++ - 在 IOS Swift 项目中使用 OpenCV 进行视频处理

    ios - 如何在同一线程上调度异步以进行串行处理

    ios - 如何从UICollectionViewController中的scrollViewDidScroll方法访问单元格成员(用于动画)?

    更新到 Xcode 11 和 swift 5 后,IOS Swift 状态栏和 Navbar 奇怪的空间顶部

    iphone - 当有一个时为零值

    swift - 导航 Controller 未释放内存,内存泄漏?