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

问题描述 投票:1回答:1

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

问题

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

  1. 用户创建一个Person(我正在处理的一个实体)
  2. 此人将保存到本地缓存→CoreData
  3. 创建并设置CKRecord以匹配本地缓存实体的数据
  4. 为了将CKRecord保存到CloudKit,创建了CKModifyRecordsOperation并设置了所有完成块和所需的属性
  5. CKModifyRecordsOperation被添加到数据库中

如果设备具有有效的网络连接,则根据需要创建CKRecord。但是当由于网络连接不良导致操作失败时,不会创建CKRecord

假设设备保持离线状态,用户决定再次删除此人。对于本地缓存在设备上的数据,这不是问题。但是由于本地缓存没有关联的CKRecordID,因此不能创建CKModifyRecordsOperation来删除云中的CKRecord

现在,设备建立网络连接并再次联机。所以现在CKModifyRecordsOperation创建了Person-Entity。这导致本地缓存和云不同步。

我想通过跟踪有关Person-Entity的未决操作来解决这个问题。如果此人被删除,则待处理的操作将被取消。

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

谢谢!

ios swift core-data icloud cloudkit
1个回答
1
投票

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

用户交互:与用户交互的工作,例如在主线程上操作,刷新用户界面或执行动画。如果工作没有快速完成,用户界面可能会显示为冻结。重点关注响应能力和表现。工作几乎是即时的。

用户启动的工作用户已启动并需要立即生成结果,例如在用户单击用户界面中的某些内容时打开已保存的文档或执行操作。需要这项工作才能继续用户互动。重点关注响应能力和表现。工作几乎是即时的,例如几秒钟或更短时间。

实用工作可能需要一些时间才能完成,并且不需要立即结果,例如下载或导入数据。实用程序任务通常具有用户可见的进度条。专注于在响应能力,性能和能效之间取得平衡。工作需要几秒钟到几分钟。

后台在后台运行且用户不可见的工作,例如索引,同步和备份。重点关注能源效率。工作需要很长时间,例如几分钟或几小时。

该页面还说默认值介于user-initiatedUtility之间。

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

当操作持续存在时,也会调用操作的longLivedOperationWasPersistedBlock

因此,选项1:尝试将QoS值调整为操作中的“更高”(更紧急)值,这应该导致抛出错误而不是将操作排队以供稍后使用。

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

© www.soinside.com 2019 - 2024. All rights reserved.