ios - 删除的 CloudKit 记录重新出现

标签 ios swift cloudkit

我正在使用 CloudKit 构建一个 iOS 应用程序。

它应该允许用户在云中添加、编辑和删除Products。用户可以在文件夹中组织这些。这些文件夹只是 cloudkit 中的其他记录类型。用户可以使用的文件夹级别没有限制,因为任何文件夹都可以只包含一个 CKReference 到它的父文件夹。我的应用程序中的所有 CloudKit 通信都发生在专用的 CloudKitController 类中

这一切都有效,但一段时间后没有明确原因停止工作。

当我测试我的应用程序时,我什至没有使用多层深度的用户文件夹。然而,在使用一段时间后(最多一周),所有删除的记录似乎都重新出现在 CloudKit 上。对此有几点说明:

  • 当我重置我的 CloudKit 仪表板并重新开始时,它运行完美。未更改代码。
  • 显然,随着应用程序的开发,我不断地编辑我的代码。但是,我通常不会在我的代码中编辑要存储在 CloudKit 中的数据类型。当我这样做时,此问题不会立即出现
  • CloudKit 控制面板中的更改(例如添加数据类型)不会导致此问题
  • 我没有像在核心数据中那样在本地存储任何记录。只要我使用它们,它们就处于单例状态
  • 当我转到 CloudKit 仪表板时,产品记录类型显示它有例如13 个实例。有时它是如此糟糕,以至于我的应用程序实际上加载了 100 多个。当我转到 recordZone 时我也可以看到它们,但 RecordType 仍然说它只有 13 个实例
  • 删除 CloudKit Dashboard 中的这些记录只会让它们消失一段时间。当我重新加载页面时,它们会再次弹出。

这样的情况已经有一段时间了,我已经多次检查我的代码、Apple Library 和谷歌,但我无法弄清楚是什么原因导致了这个问题。

问题: 有人知道如何解决这个问题吗?正如我所说,我已经遇到这个问题好几个星期了,重置我的 CloudKit 仪表板最多只能“治愈”它一个星期,然后它再次弹出。如果可以帮助您回答我的问题,我也非常乐意发布任何代码。我最初没有发布任何代码,因为我不知道什么代码可能会导致这种情况。

任何答案将不胜感激

最佳答案

这可能会发生,因为下面的仪表板跟踪表明 Apple 使用 Tombstone跨分布式数据库复制删除的技术。其中一个节点可能有错误或旧软件版本,并且正在跨系统同步墓碑错误字段,导致记录自行取消删除。或者也许您的代码正在做的事情是不小心使这些已删除的记录恢复生机?解决方法是使用您自己的软删除 bool 字段并查看其行为方式。

[{
    "results": [{
        "tombstone": false
        "id": "NewItem",
        "etag": "ibgs5bpj",
        "recordType": "Items",
        "fields": {
            "name": "Malc",
            "location": {
                "latitude": 38.0,
                "longitude": -122.0
            }
        },
        "conflictLosersEtags": [],
        "created": {
            "timestamp": 1435514295943,
            "user": "_0ac573ae502ca7ca9d763a84b27bc42a",
            "device": "_2"
        },
        "modified": {
            "timestamp": 1435514295943,
            "user": "_0ac573ae502ca7ca9d763a84b27bc42a",
            "device": "_2"
        }
    },
    ...

至于记录数,是的,我的也不准确。

关于ios - 删除的 CloudKit 记录重新出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30950081/

相关文章:

ios - 禁用 CloudKit 调试日志

iOS 可拖动 subview

ios - 无法将类型 'TLPHAsset' 的值分配给类型 'UIImage?'

iphone - 如何发送基于用户 ID 的苹果推送通知而不仅仅是设备 token ?

ios - 显示信息标记窗口后更新图像

ios - Swift - 使用 animateWithDuration 淡化 CAGradientLayer

ios - iOS 内置日历应用程序如何与各种日历源同步?

swift - 是否可以在协议(protocol)内声明具有关联类型的协议(protocol)?

ios - CloudKit 和键值存储之间的区别

macos - CKQueryOperation queryCompletionBlock 仅运行 3 次