Arhn - архитектура программирования

CloudKit - Как поделиться несколькими записями и получить общие записи?

Я последний раз смотрел WWDC 2016 Что нового в CloudKit, чтобы понять, как делиться записями с другие пользователи, использующие CKShare

Совместное использование одной записи:

Я могу поделиться и получить одну запись

т.е. если [email protected] создал и поделился одной записью с [email protected]

Совместное использование нескольких записей:

допустим, есть 10 записей, и [email protected] хочет поделиться на [email protected]. Я столкнулся с проблемой, когда пользователь [email protected] делится несколькими записями с пользователем [email protected]

Что я пробовал до сих пор:

Сначала я создал 3 записи заметок:

Примечание 1

Note2 (установить родителя как Note1)

Note3 (установить родителя как Note1)

Я поделился Note1 (родительская запись) с приведенным ниже кодом:

КОД - Поделиться записью

let controller = UICloudSharingController { controller,
        preparationCompletionHandler in

        let share = CKShare(rootRecord: self.parentRecord!)
        share[CKShareTitleKey] = "note" as CKRecordValue
        share.publicPermission = .readOnly

        let operation = CKModifyRecordsOperation(
              recordsToSave: [self.parentRecord!, share],
              recordIDsToDelete: nil)

        operation.perRecordCompletionBlock = { (record, error) in
            if let error = error {
                print("CloudKit error: \(error.localizedDescription)")
            }
        }

        operation.modifyRecordsCompletionBlock = { records, recordIDs, error in

            if error != nil {
                print(error?.localizedDescription ?? "Error")
            } else{
                print("Success")
                preparationCompletionHandler(share,CKContainer.default(), error)
            }
        }

        CKContainer.default().privateCloudDatabase.add(operation)

    }

    controller.availablePermissions = [.allowPrivate, .allowReadOnly]
    controller.delegate = self
    present(controller, animated: true)

и получил общую заметку с приведенным ниже кодом:

КОД - Чтение данных из общей заметки

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) {
    let acceptSharesOperation = CKAcceptSharesOperation(
        shareMetadatas: [cloudKitShareMetadata])

    acceptSharesOperation.perShareCompletionBlock = {
        metadata, share, error in
        if error != nil {
            print(error?.localizedDescription)
        } else {

            let operation = CKFetchRecordsOperation(
                recordIDs: [cloudKitShareMetadata.rootRecordID])

            operation.perRecordCompletionBlock = { record, _, error in

                if error != nil {
                    print(error?.localizedDescription)
                }

                if let shareRecord = record {
                    DispatchQueue.main.async() {
                        // Shared record successfully fetched. Update user
                        // interface here to present to user.
                        print("\(shareRecord["id"]!)") // id of note
                        print("\(shareRecord["text"])") // text of note
                        print("Shared record successfully fetched")
                    }
                }
            }

            operation.fetchRecordsCompletionBlock = { (recordsWithRecordIDs,error) in
                if error != nil {
                    print(error?.localizedDescription)
                }else {
                    if let recordsWithRecordIDs = recordsWithRecordIDs {
                        print("Count \(recordsWithRecordIDs.count)")
                    }
                }
            }
            CKContainer.default().sharedCloudDatabase.add(operation)
        }
    }

    CKContainer(identifier: cloudKitShareMetadata.containerIdentifier)
        .add(acceptSharesOperation)
}

Вышеупомянутый метод дает только данные родительской заметки (только корень / родитель)

Запросы:

1) Как получить записи других детей? (Я использовал термин дети для понимания цели)

2) Нужно ли каждый раз проверять, есть ли новые общие записи или нет?

Поскольку я не нашел хороших руководств и исходников из официальных документов Apple. Не могли бы вы предложить мне способ обмена и извлечения нескольких записей?

Заранее спасибо..!

13.12.2017

Ответы:


1

Я считаю, что ответ Thunk неверен, поскольку вам не нужно извлекать какие-либо записи с родительской ссылкой на данную запись. Во-первых, где бы вы искали? Дочерние записи корневой записи CKShare не отображаются в вашей общей базе данных, и у вас нет доступа к частной зоне другого пользователя. К счастью, CloudKit отправит вам все дочерние записи, на которые ссылается корневая запись CKShare. Следующий подход также решит вторую проблему, вы будете автоматически уведомлены обо всех будущих изменениях!

Главное - просто добавить CKDatabaseSubscription в общую базу данных в контейнере CloudKit. Предположим, вы клиент. Каждый раз, когда другой пользовательский общий ресурс является записью с вами, запись CKShare и основная корневая запись, на которую ссылается общий ресурс, находятся в настраиваемой зоне в частной базе данных этого пользователя. Когда вы принимаете общий ресурс (запускаете метод делегата приложения userDidAcceptCloudKitShareWith), тот же CKShare и базовая запись теперь видны вам, за исключением того, что они оба видны в вашей общей базе данных. . Если вы подписались на общую базу данных, подписка сработает и уведомит вас сразу после того, как вы примете общий доступ. Теперь вы можете получить все изменения в общей базе данных с помощью CKFetchDatabaseChangesOperation. В recordZoneWithIDChangedBlock будет указано CKRecordZoneID настраиваемой зоны пользователя совместного доступа. Вы используете это для запуска CKFetchRecordZoneChangesOperation (обязательно выполните эту операцию в общей базе данных!), Который возвращает CKShare, базовую корневую запись и все записи, имеющие родительскую ссылку на базовую ссылочную запись .

Таким образом, с помощью простой подписки на базу данных вы можете автоматически запускать и загружать все общие ресурсы, корневые записи и дочерние элементы!

23.01.2018
  • Спасибо за твой ответ, я попробую твой подход и дам тебе знать 23.01.2018
  • @ r-carney Это описание было очень полезным, хотя я все еще немного сбит с толку. Какой метод в CKFetchRecordZonesOperation возвращает фактически измененные записи? А у вас где-нибудь есть такой пример? Спасибо! 13.06.2018
  • @Clifton Labrum. Когда я делал демонстрационное приложение, я не нашел особой помощи. У меня сейчас нет образца кода. Просмотрите документацию по Apple, это будет полезно. 13.06.2018

  • 2

    Что касается вопроса 1, чтобы найти записи, которые имеют ссылки на родительский объект, вам необходимо создать запрос, который проверяет поле ссылки на rootRecordID. На этой странице Apple есть раздел, в котором обсуждаются варианты получения с примерами кода.

    https://developer.apple.com/library/content/documentation/DataManagement/Conceptual/CloudKitQuickStart/AddingReferences/AddingReferences.html

    Что касается вопроса 2, вы можете постоянно опрашивать сервер на предмет обновленных записей, но Apple не одобряет этого в одном из видеороликов WWDC, поскольку он генерирует большой сетевой трафик (и, таким образом, сжигает вашу ежемесячную квоту). Я предлагаю добавить уведомление о подписке на CKshare. Таким образом, вы будете уведомлены, когда вам нужно будет получить записи.

    13.12.2017
  • Спасибо за ответ. Я могу установить CKReference для дочерних записей, но я все еще не понимаю, как мне получить эти записи (когда пользователь, которому я поделился записями, нажимает на общую ссылку) 14.12.2017
  • поскольку в AppDelegate есть только 1 метод, в котором родительская запись получается из метаданных 14.12.2017
  • Возможно, пройдет пара дней, прежде чем я смогу опубликовать пример, но я постараюсь описать подход здесь: подписка запускает уведомление. Вы получаете recordID родительской записи из уведомления. Затем вы запрашиваете все другие записи, в которых поле ссылки совпадает с этим идентификатором записи. 14.12.2017
  • Спасибо ... Я могу получить все общие записи из зоны ... почему я не могу удалить родительскую запись, так как это дает мне ошибку Ссылочное нарушение .. любая идея? 15.12.2017
  • Это интересно, я никогда не видел этой ошибки, но вы второй, кто упомянул об этом недавно здесь, на SO. Я еще не перешел на IOS 11 и теперь боюсь, что Apple что-то сломала. Это может стоить отдельного вопроса с соответствующим кодом и скриншотами схемы с панели инструментов. 15.12.2017
  • Спасибо за твою помощь .. позвольте мне задать вопрос на форуме .. Ваш ответ поможет мне решить мои вопросы, поэтому я собираюсь принять его ..! 16.12.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..


    © 2024 arhn.ru, Arhn - архитектура программирования