CloudKit:删除记录的 CKQueryOperation

Posted

技术标签:

【中文标题】CloudKit:删除记录的 CKQueryOperation【英文标题】:CloudKit: CKQueryOperation for deleted records 【发布时间】:2016-03-30 01:26:58 【问题描述】:

有没有一种方法可以在不使用CKFetchRecordChangesOperation 的情况下查询 CloudKit 以获取最近删除的项目(可能来自特定的时间戳)?我正在使用公共数据库,所以我不能使用自定义区域(这将是 CKFetchRecordChangesOperation 的要求)......所以我需要一种方法来使用公共数据库来模拟它。

我希望能够针对 CloudKit 记录中的更改有效地更新我的本地核心数据缓存。当您查询 CloudKit 记录时,CKRecord 似乎有一个 creationDatemodificationDate 属性,可以查询以查看最近创建/修改的记录,但这不适用于在 CloudKit 中删除的记录。

这里有什么有效的策略?

【问题讨论】:

您可以创建一个订阅,当记录被删除时会报告? 这个想法是使用查询,因为订阅依赖于推送通知,这可能可靠也可能不可靠,并且您不能使用拉动刷新功能来触发与订阅的同步 不,没有简单的方法可以查询已删除的内容。 【参考方案1】:

我考虑过的一个解决方案是在 CKRecord 上维护一个“deletedDate”属性,因此当“删除”数据时,您实际上并没有从 CloudKit 中删除记录,而只是更新此属性。这将使其他设备可以查询最近已删除的记录,因此您可以更新本地缓存。您还可以定期检查已删除日期超过 1 周或其他时间的记录,并在该时间点实际删除记录(尽管您要注意多个设备同时删除记录,以及其他边缘情况)。不是最优雅的解决方案,但可以工作。如果有更好的选择,很想听听。

【讨论】:

小提示。就我而言,我需要使用 Mac OSX 应用程序为公共数据库实现多用户支持工具。所以我也将 dateDeleted 集成到 Core Data 实体中,并在 Mac OS X 部分添加了数据库同步(和订阅)。为了隐藏“已删除”的记录,添加了对 Array 控制器的简单谓词。【参考方案2】:

我想到的一个解决方案是在 CKRecord 上维护一个“deletedDate”属性,

这不是必需的

你想要一个CKFetchRecordZoneChangesOperation

去这里观看 WWDC 视频:https://developer.apple.com/videos/play/wwdc2014/231/

https://developer.apple.com/icloud/

【讨论】:

请注意,此 API 现在已弃用。相反,使用 CKFetchDatabaseChangesOperation 来获取特定区域中的更改,其中包括删除。

以上是关于CloudKit:删除记录的 CKQueryOperation的主要内容,如果未能解决你的问题,请参考以下文章

删除 CloudKit 记录 Swift 4

每天从特定记录类型中删除所有记录 CloudKit

CloudKit公共数据库删除记录

如何删除 CKRecord 和 CloudKit 中的所有引用记录

Swift cloudkit CKFetchRecordZoneChangesOptions 无法返回删除记录

swift Swift - CloudKit - 添加保存删除多个记录