我有某种 CloudKit 索引问题。当我使用 CKModifyRecordsOperation 将记录保存到 iCloud 时,modifyRecordsCompletionBlock 不会返回任何错误。当我使用 NSPredicate(value: true) 或 Dashboard 查询这些记录时,大多数情况下它会丢失一两条记录。
假设我上传了 5 条记录(没有错误),等待一段时间(~15 秒)以确保索引已更新,然后查询它们(通过仪表板或应用程序的 CKQueryOperation)。大多数情况下,它会显示 5 条记录中的 4 条记录。同样,没有错误。记录在 customZone 的 privateDB 中。
奇怪的是:我总是能够通过在“获取”菜单下的仪表板(开发)中手动键入记录名称来获取查询未返回的记录。所以它存储它们,只是不查询。当我删除仪表板中的索引并重新分配它们时,仪表板查询将开始返回所有结果(以前也省略了记录),但是在再上传几次后,查询中又会开始丢失一些结果。
这是我的 CKModifyRecordsOperation:
let operation = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: [])
operation.modifyRecordsCompletionBlock =
{ [weak self] savedRecords, deletedRecordIDs, error in
guard error == nil else { // no errors here ... }
...
//for each item uploaded to iCloud, mark as synced
if let savedRecords = savedRecords{ // all attempted to save records are here
PendingCloudOperations.shared.markAsUploaded(
savedRecords.map{ $0.recordID.recordName })
}
completion(...)
}
operation.savePolicy = .changedKeys // tried .allKeys too
operation.qualityOfService = .userInitiated
self.privateDB.add(operation)
我尝试了记录字段(最初是日期、资产和参考),试图查看是否有任何字段出现问题。但即使我删除了所有字段(创建一个没有额外字段的记录,只是系统元数据),问题仍然存在。我没有包含 CKQueryOperation 代码,因为 Dashboard 的行为方式与应用程序相同。
有任何想法吗?
编辑:这是我的获取功能的基本内容:
var receipts:[FS_Receipt] = []
let query = CKQuery(recordType: myRecordType, predicate: NSPredicate(value: true))
let operation = CKQueryOperation(query: query)
//completion block
operation.queryCompletionBlock = { [weak self] cursor, error in
guard error == nil else {
// doesn't have any errors here
}
completion(...)
}
operation.recordFetchedBlock = { record in
// doesn't return all records here most of the time.
}
operation.qualityOfService = .userInitiated // without this, 'no internet' will NOT return error
operation.resultsLimit = 5000
operation.zoneID = customZoneID
self.privateDB.add(operation)
}