我有一个使用CloudKit进行同步的应用程序,并且维护记录的本地缓存。我遇到了无法解决的同步情况。
我正在使用公共数据库,当我打开我的应用程序时,我希望能够获取我的应用程序在关闭时丢失的所有更新记录,或者在设备上该应用程序刚刚安装。
我可以通过创建NSPredicate
来比较modificationDate
来获得更新记录,如下所示:
let predicate = NSPredicate(format: "modificationDate > %@", syncTimestamp as CVarArg)
let query = CKQuery(recordType: recordType, predicate: predicate)
但是我不知道的部分是如何仅获取已添加到CloudKit服务器或从CloudKit服务器中删除的记录。
有人知道该怎么做吗?我知道Apple在私有数据库中为此提供了一种方法,但是我在这里使用了公共数据库。
到目前为止,我唯一想到的就是查询某个recordType
的所有记录,收集所有recordName
并与我的本地缓存进行比较。但是,比起只提取大量数据并比较recordName
的大型数组来,有一种更聪明的方法会很好。
答案 0 :(得分:0)
CKQuerySubscription(recordType: myRecordType, predicate: predicate, options: [.firesOnRecordCreation, .firesOnRecordDeletion])
在公共数据库上完美运行。
这是一个代码段(使用 RxCloudKit 完成保存订阅,但这超出了要点)-
let predicate = NSPredicate(format: "TRUEPREDICATE")
// the options are different from what you need, just showcasing the possibilities:
let subscription = CKQuerySubscription(recordType: recordTypeTest, predicate: predicate, options: [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion, .firesOnce])
let info = CKNotificationInfo()
info.alertLocalizationKey = "NEW_PARTY_ALERT_KEY"
info.soundName = "NewAlert.aiff"
info.shouldBadge = true
subscription.notificationInfo = info
self.publicDB.rx.save(subscription: subscription).subscribe { event in
switch event {
case .success(let subscription):
print("subscription: ", subscription)
case .error(let error):
print("Error: ", error)
default:
break
}
}.disposed(by: self.disposeBag)