CloudKit: запрос возвращает частичные результаты, без ошибок
У меня какая-то проблема с индексированием CloudKit. Когда я сохраняю записи в iCloud с помощью CKModifyRecordsOperation, modifyRecordsCompletionBlock не возвращает ошибок. Когда я запрашиваю эти записи, используя NSPredicate(значение: true) или Dashboard, в большинстве случаев он пропускает одну или две записи.
Скажем, я загружаю 5 записей (без ошибок), подожду некоторое время (~15 секунд), чтобы убедиться, что индексы обновлены, и затем запросю их (через панель управления или приложение CKQueryOperation). Большую часть времени он будет показывать 4 записи из 5. Опять нет ошибок. Записи находятся в privateDB в customZone.
Вот что странно: я всегда могу получать записи, которые не возвращал запрос, вручную набирая recordNames в Dashboard (разработка) в меню "Fetch". Таким образом, он хранит их, просто не запрашивает. Когда я удаляю индексы в панели мониторинга и переназначаю их, запрос панели мониторинга начнет возвращать все результаты (с ранее пропущенными записями), но после нескольких дополнительных загрузок некоторые из них снова будут отсутствовать в запросе.
Вот мой 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)
}