Удаление записей CloudKit Swift 4

У меня проблемы с удалением записей CloudKit. Я впервые имею дело с API, и, видимо, есть два способа сделать это.

Сохранение записей является прямым и якобы таким же образом, как удаление их, за исключением того, что это не делает:

func deleteRecords() {

    let recordID = record.recordID
    publicDatabase.delete(withRecordID: recordID) { (recordID, error) in
        guard let recordID = recordID else {
        print(error!.localizedDescription)
            return
    }
        print("Record \(recordID) was successfully deleted")
    }
}

Я понимаю, используя ckModifyRecordsOperation это еще один способ сделать это, но это пакетная операция. Мне нужно удалить только одну запись за раз. Вот мой код для этого:

 func batchDelete() {
    let recordIDsToDelete = [CKRecordID]()
    let operation = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: recordIDsToDelete)
    operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
        // handle errors here
    }
    publicDatabase.add(operation)
    print("Batch \(recordIDsToDelete) record was successfully deleted")
}

Ни один из них отдельно или вместе не работает для меня.

1 ответ

Вы правы, есть два пути. Первый способ, который вы описываете, упоминается Apple как "удобная" функция. Если вы просто удаляете одну запись, возможно, это самый быстрый вариант для реализации. Тем не менее, каждая удобная операция выполняет свою собственную поездку в базу данных. Если вы просматриваете тысячи записей и удаляете их по отдельности с помощью удобной функции, вы будете использовать большую часть своей квоты cloudKit, выполняя серию отдельных вызовов.

Второй вариант, операция, позволяет вам пакетно удалить и отправить их за одну операцию. Как правило, это будет более эффективным использованием ваших квот на облачный набор. Но, согласно документам Apple, между ними нет технической разницы; удобная функция - это просто оболочка для операции.

Теперь, к вашей конкретной проблеме, операция имеет два отдельных блока завершения: perRecordCompletionBlock а также modifyRecordsCompletionBlock, Как видно из названий, первый блок вызывается после обработки каждой и каждой записи в операции, и именно здесь появляются ошибки. Убедитесь, что вы реализуете perRecordCompletionBlock и проверьте там ошибки (и тогда вам придется решить, относятся ли ваши шаги по обработке ошибок к perRecordCompletionBlock или modifyRecordsCompletionBlock).

Наконец, если операция (или вспомогательная функция) запущена, и вы подтверждаете, что блоки завершения завершаются без ошибок, но запись по-прежнему не удаляется, это обычно означает, что вы передали nil, а не действительную запись для удаления.

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