在CloudKit中保存对象数组

时间:2015-01-07 17:36:40

标签: swift ios8 cloudkit ckreference

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

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

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

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

我已设法保存一个Collection而没有任何Item实例,并带有以下代码

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的所有实例并单独保存它们,它们的Reference Attribute to Collection在CloudKit端进行连接,但这似乎是太多的网络调用。

1 个答案:

答案 0 :(得分:3)

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

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

如果你有一个Collection对象,那么你可以使用一个谓词轻松查询Item recordType,该谓词检查CKReference是否是Collection的。

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

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