在 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
记录,您需要CKReference
到Collection
。然后,您将能够在其上设置 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 搜索