在CloudKit中保存对象数组

Wil*_*son 9 swift ios8 cloudkit ckreference

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

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

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

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

我已设法使用以下代码保存没有任何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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个选项是在保存Collection时,循环遍历Item的所有实例并单独保存它们,它们的Reference Attribute to Collection在CloudKit端进行连接,但这似乎是太多的网络调用.

Edw*_*eer 3

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

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

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

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

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

  • 有多种解决方案可用于维护手动排序顺序。1. 创建一个单独的记录,按照您想要的顺序保存所有 id。然后更改排序顺序后,您只需更改这一记录即可。2.创建链表。每条记录都会包含对下一条记录的引用。更改排序顺序时,只需更改 3 条记录(新指针、旧指针和当前记录)。3 将排序顺序号放入记录中。然后,您必须在排序顺序更改后更新所有记录。 (3认同)