首页 > 解决方案 > 带有 modifyDate 的 CloudKit 查询始终不返回任何结果

问题描述

User我的目标是从我在 s 数组中指定的 CloudKit获取记录,CKRecord.ID但前提是它们的更新时间比我在本地跟踪的上次更新日期更新。

我正在执行以下 CloudKit 查询:

var predicate:NSPredicate

if let lastChecked = defaults.object(forKey: "lastUserFetch") as? Date{
  //Subsequent fetches
  predicate = NSPredicate(format: "modificationDate > %@ AND recordID IN %@", argumentArray: [lastChecked, userRecordIDs])

}else{
  //First fetch
  predicate = NSPredicate(format: "recordID IN %@", argumentArray: [userRecordIDs])
}

let query = CKQuery(recordType: "User", predicate: predicate)
let operation = CKQueryOperation(query: query)
...

我最初设置lastUserFetchnil我的应用程序启动时,并且查询的“第一次获取”部分成功。我取回所有用户记录。

但是一旦我在查询完成后设置我的lastUserFetch日期:

defaults.set(Date(), forKey: "lastUserFetch")

包含该部分时,我会0返回记录。modificationDate > %@当然,我修改了 CloudKit 仪表板中的记录,我可以看到它们modificationDate已经更新并且比我的lastUserFetch日期更新,但它们仍然没有在我的搜索结果中返回。

如何将modificationDate比较与recordID IN查询结合起来?

标签: nspredicatecloudkitckqueryckqueryoperation

解决方案


使用NSCompoundPredicate

var predicate:NSPredicate

//Every fetch
predicate = NSPredicate(format: "recordID IN %@", argumentArray: [userRecordIDs])

if let lastChecked = defaults.object(forKey: "lastUserFetch") as? Date{
  //Subsequent fetches
  predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate,  NSPredicate(format: "modificationDate > %@", argumentArray: [lastChecked]))
}
let query = CKQuery(recordType: "User", predicate: predicate)
let operation = CKQueryOperation(query: query)
...

推荐阅读