从CloudKit获取不在设备上的记录的任何(或最佳)方式?

时间:2014-11-17 19:50:51

标签: ios swift ios8 cloudkit

我有以下谓词:

let predicate = NSPredicate(format: "NOT (recordID in %@)", recordIDs)
-- recordIDs is an array of CKRecordID objects corresponding to the CKRecords on the device

...产生关于谓词的运行时错误。如果我将谓词格式字符串更改为其他内容,则查询运行正常。我有"查询"复选框在CloudKit中检查此记录类型的所有元数据。

根据CKQuery documentation

  

谓词中使用的键名对应于当前评估记录中的字段。键名可以包括记录的元数据属性的名称,例如" creationDate“或您添加到记录中的任何数据字段。

根据CKRecord documentation,这些是用于查询的可用元数据:

  

recordID,recordType,creationDate,creatorUserRecordID,modificationDate,lastModifiedUserRecordID,recordChangeTag

3 个答案:

答案 0 :(得分:1)

您可以使用创建日期:

NSPredicate(format: "creationDate > %@", dateLastFetched)

将记录下拉到设备并保存后,保存dateLastFetched并将其用于后续提取。

编辑:确保在CloudKit仪表板上启用creationDate查询索引(默认情况下不像许多其他索引那样启用)

答案 1 :(得分:0)

点击此处启用元数据索引:

enter image description here

答案 2 :(得分:0)

这是一个古老的问题,所以我不确定它是否当时存在,但是现在正确的方法是使用Apple内置的服务器更改令牌支持。 / p>

对包含设备上所有现有记录ID的大型查询进行查询将很慢,并且选择日期也不精确。

正确的方法是使用CKFetchRecordZoneChangesOperation并使用操作的CKServerChangeToken属性传递configurationsByRecordZoneID

第一次调用时,传递一个nil更改令牌。收到记录后,CloudKit将使用最新的更改令牌调用recordZoneChangeTokensUpdatedBlock。坚持使用最新的令牌,以便下次您需要从服务器记录时,只需传递最新的令牌即可,然后仅获取自那时以来发生的更改。