将序列与 CloudKit 同步的最佳方法是啥?
Posted
技术标签:
【中文标题】将序列与 CloudKit 同步的最佳方法是啥?【英文标题】:What is best way to sync a sequence with CloudKit?将序列与 CloudKit 同步的最佳方法是什么? 【发布时间】:2020-01-23 20:52:34 【问题描述】:我正在尝试使用 CloudKit 来同步用户创建的一系列项目。考虑一个具有特定顺序的 TODO 列表。
我的第一个想法可能是给每个 TODO 一个 position 属性,但我认为这可能不是一个好主意,因为当您从多个设备同步时,我不确定 CloudKit 如何处理合并。然后丢失或重复的 position 肯定会使 tableView 崩溃。
我想也许另一种方法是将一系列 TODO id 保存到 [String]
但实际上该数组会遇到相同的合并问题?
什么是最佳实践?
【问题讨论】:
【参考方案1】:在我的一个应用程序中,我采用了添加序列属性(如您在问题中所说的位置属性)的方法。当我从 CloudKit 进行查询以获取所有项目时,我按我的序列属性排序,然后所有内容都以正确的顺序显示在 tableview 中。
对于编辑/更改顺序,我使用 MoveRowAt() 函数允许用户拖放和重新排序表中的项目(示例如下)。
一旦移动了一个对象,我就会运行一个 for each 循环来更新所有项目的序列属性以反映新的序列。
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)
let movedObject = self.headlines[sourceIndexPath.row]
headlines.remove(at: sourceIndexPath.row)
headlines.insert(movedObject, at: destinationIndexPath.row)
以上示例来自:https://www.ralfebert.de/ios-examples/uikit/uitableviewcontroller/reorderable-cells/
然后我保存更新的项目集(首先在我的应用程序中本地存储到 Core Data,然后稍后推送到 CloudKit……但你可以做任何对你最有意义的事情)。
在构建 tableview 时,很容易错误地处理丢失或重复的位置 - 但如果你在 move 事件上循环遍历每个项目,那么你不应该有这个问题。
不确定我是否关注“合并”问题 - 您能详细说明一下吗?
【讨论】:
我与 Apple 技术支持人员进行了交谈,他们明确表示不要这样做。特别是因为合并问题。我所说的合并问题是,您假设 cloudkit 对于多记录更改是原子的(例如,record1.pos=3、record2.pos=4 等)。但事实并非如此。因此,如果两台设备对同一个列表重新排序,您最终可能会从每台设备获得一半的序列。 很有意义 - 虽然对于我的场景,重新排序是在保存到 cloudkit 之前在本地完成的 - 并且应用程序的流程意味着一旦发布到 cloudkit,就会设置顺序。但很高兴知道他们反对它。 @erotsppa 苹果说要做什么? :)以上是关于将序列与 CloudKit 同步的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Apple Watch 与 iPhone 通信的最佳方式是啥? [关闭]
将 Azure 搜索结果反序列化为您自己的模型的最佳方法是啥?