【问题标题】: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] 但实际上该数组会遇到相同的合并问题?

什么是最佳实践?

【问题讨论】:

    标签: ios swift core-data cloudkit


    【解决方案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 苹果说要做什么? :)
    猜你喜欢
    • 2017-01-08
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2016-12-10
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多