如果CKRecord由于网络连接不良而尚未创建完毕,如何删除? [英] How to delete a CKRecord if not yet finished creating due to bad network connection?

查看:0
本文介绍了如果CKRecord由于网络连接不良而尚未创建完毕,如何删除?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开发一个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。如果它触发,您可以尝试取消该块中的操作,并向用户显示"无网络"错误。

这篇关于如果CKRecord由于网络连接不良而尚未创建完毕,如何删除?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆