Удаление CloudKit Records 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")
}

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


person davidoliverdoswell    schedule 07.12.2017    source источник
comment
Никто, кроме вас, не знает, что такое publicDatabase.   -  person El Tomato    schedule 07.12.2017
comment
Вы не предоставили никаких полезных подробностей. Что на самом деле происходит, когда вы запускаете этот код? Что происходит в обработчике завершения в вашем deleteRecords методе? И обратите внимание, что в вашем batchDelete методе вы не пытаетесь ничего удалить, поскольку вы передаете пустой массив.   -  person rmaddy    schedule 07.12.2017
comment
Я дам вам голос за то, что вы постоянно пропускаете важную информацию.   -  person El Tomato    schedule 08.12.2017
comment
@maddy ничего. Я могу удалить строку в tableView и обновить ее. Мой refreshTable снова запрашивает базу данных и перезагружает таблицу, но строка, которую я удалил, появляется снова. Я спрашиваю, почему запись не удаляется из базы данных.   -  person davidoliverdoswell    schedule 08.12.2017
comment
@ElTomato, если вы использовали cloudKit до того, как узнали код. Другого способа создать его экземпляр нет. Это простой вопрос, почему это и this отличается тем, что они оба должны удалить recordIDs, который я создаю с помощью (опять же, если вы использовали cloudKit: let record = CKRecord(recordType: "RecordName")   -  person davidoliverdoswell    schedule 08.12.2017
comment
Это простой вопрос, почему вы не раскрываете все детали своего проекта. Как называется тип записи? Как устанавливаются роли безопасности? Как называется облачная база данных? Почему вы используете базу данных общедоступного облака, а не базу данных частного облака?   -  person El Tomato    schedule 08.12.2017
comment
1. См. Предыдущий пост о recordType. Не обязательно знать, чтобы использовать методы, которые я предоставил. 2. Роли безопасности? Для удалений? 3. Название моего проекта, опять же, никакого отношения к удалениям. 4. Потому что publicDatabase - это место, где хранятся все данные в проекте. Нет профилей. Опять же, ничего общего с удалением записей.   -  person davidoliverdoswell    schedule 08.12.2017
comment
@ElTomato Приносим извинения за недостаточный вопрос и ответ. Я был разочарован одним проектом и отказался от него всех. Мне жаль. Я снова задам этот вопрос завтра, тщательно проработав то, что я пытаюсь достичь.   -  person davidoliverdoswell    schedule 08.12.2017


Ответы (1)


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

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

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

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

person Thunk    schedule 08.12.2017
comment
Спасибо! Я буду реализовывать это и посмотрю, что произойдет. Я прочитал это в документации и не мог получить ошибки, потому что (я думаю) я не реализовал perRecordCompletionBlock :) - person davidoliverdoswell; 09.12.2017