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)
}

0 ответов

Другие вопросы по тегам