在 CloudKit 中保存对象数组

Saving An Array Of Objects In CloudKit

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

假设我有一个待办事项列表应用程序,其中包含不同的项目集合。我将如何处理 saving/fetching 整个项目集合?

我是否会有一个记录类型的集合,它会有一个名为 "Name" 的字符串属性,然后是一个名为 "Items" 的引用列表属性?

我知道项目的记录类型需要有一个名为 "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)
        }
    }
}

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

对于 Item 条记录,您需要 CKReferenceCollection。然后你就可以在上面设置 CKReferenceAction 了。您不需要在 Collection 上创建 CKReference 列表。

当您计划使用 CKReferenceAction.None 时,只有一个 CKReference 对象列表是一个选项,这意味着两个 recordTypes 之间没有严格的关系

如果您有一个 Collection 对象,那么您可以使用检查 CKReference 是否是 Collection.[=26= 的谓词轻松查询 Item recordType ]

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

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