如果CKRecord由于网络连接不良而尚未创建完毕,如何删除?

2022-08-19 00:00:00 ios swift icloud core-data cloudkit

我目前正在开发一个iPhone应用程序,它使用CloudKit在用户的设备之间同步应用程序数据。我使用CoreData作为本地缓存,以确保设备脱机时应用保持可用。

问题

在开发过程中,我遇到了一个关于设备脱机时同步行为的问题。让我举一个例子来解释一下:

  1. 用户创建了Person(我正在处理的一个实体)
  2. 人员保存到本地缓存→核心数据
  3. 创建和设置CKRecord以匹配本地缓存实体的数据
  4. 若要将CKRecord保存到CloudKit,将创建并设置CKModifyRecordsOperation,其中包含所需的所有完成块和属性
  5. CKModifyRecordsOperation已添加到数据库
如果设备具有正常工作的网络连接,则会根据需要创建CKRecord。但当操作因网络连接错误而失败时,不会创建CKRecord

假设设备保持脱机状态,并且用户决定再次删除此人。这对于本地缓存在设备上的数据来说是没有问题的。但由于本地缓存没有关联CKRecordID,所以无法创建CKModifyRecordsOperation来删除云中的CKRecord

现在,设备建立了网络连接并再次联机。因此,现在执行了创建Person实体的CKModifyRecordsOperation。这会导致本地缓存和云不同步。

我想通过跟踪有关Person实体的挂起操作来解决此问题。如果此人被删除,则挂起的操作将被取消。

不幸的是,我无法让它运行。因此,如果我在正确的轨道上,我将不胜感激!

谢谢!


解决方案

尝试调整操作的.qualityOfService属性。Per Apple Docs athttps://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html#//apple_ref/doc/uid/TP40015243-CH39:

用户交互:与用户交互的工作,如 在主线程上操作,刷新用户界面,或者 表演动画。如果工作不能快速完成,则用户 接口可能显示为冻结。专注于响应能力和 性能。工作几乎是瞬间完成的。

用户发起的用户已发起并需要的工作 即时效果,例如打开保存的文档或执行 用户在用户界面中单击某项内容时的操作。这项工作 才能继续用户交互。重点放在 响应速度和性能。工作几乎是瞬间的,这样 几秒钟或更少。

实用程序可能需要一些时间才能完成且不需要立即产生结果的工作,如下载或导入数据。 实用程序任务通常有一个进度条,该进度条对 用户。专注于在响应性和响应性、 性能和能效。工作需要几秒钟到一次 几分钟。

后台在后台运行且对 用户,如索引、同步和备份。重点放在 能源效率。工作需要相当长的时间,例如几分钟或 小时。

该页还表示默认值介于user-initiatedUtility之间。

根据Apple Dev论坛https://forums.developer.apple.com/thread/20047上的讨论,用户报告在离线时没有收到失败的查询错误,就像你看到的那样,这些查询似乎实际上是持久的,并在连接恢复时重试。该线程中的用户报告称,将Qos参数更改为User-initiated会在操作由于没有网络而无法完成时立即返回错误。

在持久化操作时,似乎还会调用操作的longLivedOperationWasPersistedBlock

因此,选项1:尝试将操作的Qos值调整为"更高"(更紧急)的值,这应该会导致引发错误,而不是将操作排队等待以后执行。

选项2:尝试添加longLivedOperationWasPersistedBlock。如果它触发,您可以尝试取消该块中的操作,并向用户显示"无网络"错误。

相关文章