如何从CloudKit中获取不在我本地缓存中的记录

时间:2018-10-27 03:44:21

标签: cloudkit

我有一个使用CloudKit进行同步的应用程序,并且维护记录的本地缓存。我遇到了无法解决的同步情况。

我正在使用公共数据库,当我打开我的应用程序时,我希望能够获取我的应用程序在关闭时丢失的所有更新记录,或者在设备上该应用程序刚刚安装。

我可以通过创建NSPredicate来比较modificationDate来获得更新记录,如下所示:

let predicate = NSPredicate(format: "modificationDate > %@", syncTimestamp as CVarArg) 
let query = CKQuery(recordType: recordType, predicate: predicate)

但是我不知道的部分是如何仅获取已添加到CloudKit服务器或从CloudKit服务器中删除的记录

有人知道该怎么做吗?我知道Apple在私有数据库中为此提供了一种方法,但是我在这里使用了公共数据库。

到目前为止,我唯一想到的就是查询某个recordType所有记录,收集所有recordName并与我的本地缓存进行比较。但是,比起只提取大量数据并比较recordName的大型数组来,有一种更聪明的方法会很好。

1 个答案:

答案 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)