如果CKRecord由于网络连接不良而尚未创建完毕,如何删除?
我目前正在开发一个iPhone应用程序,它使用CloudKit在用户的设备之间同步应用程序数据。我使用CoreData作为本地缓存,以确保设备脱机时应用保持可用。
问题
在开发过程中,我遇到了一个关于设备脱机时同步行为的问题。让我举一个例子来解释一下:
- 用户创建了
Person
(我正在处理的一个实体) - 人员保存到本地缓存→核心数据
- 创建和设置
CKRecord
以匹配本地缓存实体的数据 - 若要将
CKRecord
保存到CloudKit,将创建并设置CKModifyRecordsOperation
,其中包含所需的所有完成块和属性 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-initiated
和Utility
之间。
根据Apple Dev论坛https://forums.developer.apple.com/thread/20047上的讨论,用户报告在离线时没有收到失败的查询错误,就像你看到的那样,这些查询似乎实际上是持久的,并在连接恢复时重试。该线程中的用户报告称,将Qos参数更改为User-initiated
会在操作由于没有网络而无法完成时立即返回错误。
longLivedOperationWasPersistedBlock
。
因此,选项1:尝试将操作的Qos值调整为"更高"(更紧急)的值,这应该会导致引发错误,而不是将操作排队等待以后执行。
选项2:尝试添加longLivedOperationWasPersistedBlock
。如果它触发,您可以尝试取消该块中的操作,并向用户显示"无网络"错误。
相关文章