在 CloudKit 中保存对象数组

Posted

技术标签:

【中文标题】在 CloudKit 中保存对象数组【英文标题】:Saving An Array Of Objects In CloudKit 【发布时间】:2015-01-07 17:36:39 【问题描述】:

我对如何在 CloudKit 中最好地保存包含其他对象数组的对象感到困惑。

假设我有一个待办事项列表应用程序,它有不同的项目集合。我将如何保存/获取整个项目集合?

我是否有一个 Collection 类型的 Record,它有一个名为“Name”的字符串属性,然后是一个名为“Items”的引用列表属性?

我知道 Item 的 Record 类型需要有一个名为“Collection”的引用属性,因为 CloudKit 如何从子对象引用其父对象。

我已经设法使用以下代码保存了一个没有任何 Item 实例的 Collection

func addCollection(collection: Collection!, completion: (error: NSError!) -> ()) 
    if collection == nil
        return
    
    let collectionRecord = CKRecord(recordType: "Collection")
    CollectionRecord.setObject(collection.name, forKey: "Name")
    privateDB.saveRecord(collectionRecord) 
        record, error in
        dispatch_async(dispatch_get_main_queue()) 
           completion(error: error)
        
    

另一种选择是在保存 Collection 时,循环遍历 Item 的所有实例并单独保存它们,它们对 Collection 的引用属性在 CloudKit 端建立连接,但这似乎太多的网络调用。

【问题讨论】:

【参考方案1】:

对于Item 记录,您需要CKReferenceCollection。然后,您将能够在其上设置 CKReferenceAction。您无需在Collection 上创建CKReference 列表。

只有当您计划使用CKReferenceAction.None 时,才可以选择拥有 CKReference 对象列表,这意味着两个记录类型之间没有严格的关系

如果您有一个Collection 对象,那么您可以使用检查CKReference 是否为Collection 的谓词轻松查询Item 记录类型。

通常不需要保存多条记录。一旦你创建了一个包含项目的集合,关系就可以保持不变。如果您确实需要更改多条记录,那么您可以尝试使用CKModifyRecordsOperation,它支持在一个操作中保存多个项目。

将现有的Item 记录类型链接到Collection 时,您确实需要保存每个Item,因为它有一个指向Collecion 的CKReference。 Item 已更改,因此必须保存。

【讨论】:

那你如何保证集合中物品的顺序呢?恐怕取物品时,它们到达的顺序与保存时的顺序不同…… 您可以像这样添加排序顺序:query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 是的,但我需要保持用户设置的数组顺序,而不是每次获取数组时都应用排序。 维护手动排序顺序有多种解决方案。 1.创建一个单独的记录,您可以按照您想要的顺序保存所有ID。然后在更改排序顺序后,您只需更改这一记录。 2.创建链表。每条记录都包含对下一条记录的引用。更改排序顺序时,您只需更改 3 条记录(新指针、旧指针和当前记录)。 3 在记录中输入排序顺序号。然后,您必须在排序顺序更改后更新所有记录。 好的,谢谢,我害怕这个答案 :-) 我想选项 1 是我最好的选择。

以上是关于在 CloudKit 中保存对象数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 和数组进行 cloudKit 搜索

如何使用 Cloudkit 将字典(或任何其他复杂结构)保存到 iCloud 中?

我可以将对象图保存到 CloudKit 吗?

尝试将对象保存到 CloudKit 记录时得到 nil

SwiftUI 和 CloudKit 异步数据加载

如何从数组中的对象中删除“Optional()”