将序列与 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 搜索结果反序列化为您自己的模型的最佳方法是啥?

在 Pandas 中,将 tz_localize 用于忽略 DST 的时间序列的最佳方法是啥?

CoreData与CloudKit同步时将图像保存到CoreData?