Сохранение массива объектов в CloudKit

Я не понимаю, как лучше всего сохранить объект, содержащий массив других объектов в CloudKit.

Скажем, у меня есть приложение со списком дел, в котором есть разные коллекции элементов. Как мне сохранить / получить всю коллекцию предметов?

Могу ли я иметь коллекцию типа Record, которая будет иметь строковый атрибут с именем «Name», а затем атрибут списка ссылок с именем «Items»?

Я знаю, что у элемента типа Record должен быть ссылочный атрибут под названием «Collection», потому что CloudKit ссылается от дочернего объекта на его родительский.

Мне удалось сохранить коллекцию без каких-либо экземпляров элемента со следующим кодом

func addCollection(collection: Collection!, completion: (error: NSError!) -> ()) {
    if collection == nil
        return
    }
    let collectionRecord = CKRecord(recordType: "Collection")
    CollectionRecord.setObject(collection.name, forKey: "Name")
    privateDB.saveRecord(collectionRecord) {
        record, error in
        dispatch_async(dispatch_get_main_queue()) {
           completion(error: error)
        }
    }
}

Другой вариант - при сохранении коллекции перебрать все экземпляры элемента, а также сохранить их по отдельности, их ссылочный атрибут для коллекции устанавливает соединение на стороне CloudKit, но это кажется слишком большим количеством сетевых вызовов.


person William Robinson    schedule 07.01.2015    source источник


Ответы (1)


Для записей Item вам нужно CKReference на Collection. После этого вы сможете установить для этого CKReferenceAction. Вам не нужно создавать CKReference список на Collection.

Наличие списка объектов CKReference - это вариант, только если вы планируете использовать CKReferenceAction.None, что будет означать, что между двумя типами записей нет строгой связи.

Если у вас есть объект Collection, вы можете легко запросить Item recordType, используя предикат, который проверяет, соответствует ли CKReference Collection.

Обычно нет необходимости сохранять несколько записей. После того, как вы создали коллекцию с элементами, отношение может оставаться неизменным. Если вам действительно нужно изменить несколько записей, вы можете попробовать использовать CKModifyRecordsOperation, который поддерживает сохранение нескольких элементов за одно действие.

При связывании существующих Item типов записей с Collection вам необходимо сохранить каждый Item, потому что он имеет ссылку CKReference на Collecion. Item изменился, поэтому его нужно сохранить.

person Edwin Vermeer    schedule 14.01.2015
comment
Тогда как вы гарантируете порядок вещей в коллекции? Боюсь, что при получении предметов они придут в другом порядке, чем при сохранении ... - person Frédéric Adda; 07.04.2015
comment
Вы можете добавить такой порядок сортировки: query.sortDescriptors = [NSSortDescriptor (key: creationDate, ascending: false)] - person Edwin Vermeer; 07.04.2015
comment
Да, но мне нужно сохранять порядок массива, установленный пользователем, а не применять сортировку каждый раз, когда я извлекаю массив. - person Frédéric Adda; 07.04.2015
comment
Существует несколько решений для поддержания порядка сортировки вручную. 1. Создайте отдельную запись, в которой вы сохраните все идентификаторы в нужном вам порядке. Затем после изменения порядка сортировки вам нужно изменить только эту запись. 2. создать связанный список. каждая запись будет иметь ссылку на следующую запись. При изменении порядка сортировки вам нужно изменить только 3 записи (новый указатель, старый указатель и текущую запись). 3 поместите в запись порядковый номер сортировки. Затем вам необходимо обновить все записи после изменения порядка сортировки. - person Edwin Vermeer; 07.04.2015
comment
Хорошо, спасибо, я боялся этого ответа :-) Думаю, вариант 1 - мой лучший выбор. - person Frédéric Adda; 07.04.2015