CKAsset не сохранен в CloudKit - все остальные поля сохранены - PullRequest
0 голосов
/ 08 мая 2018

У меня есть приложение CloudKit, которое в основном представляет собой основную настройку дополнительная функция. Любой подробный объект может быть помечен как ActiveNote. когда приложение находится на iPad, отображается ТОЛЬКО эта ActiveNote (нет пользователя) взаимодействие). Приложение включает в себя уведомления и подписки со всеми данные в пользовательской зоне в частной базе данных. Приложение хорошо работает с одно исключение.

Есть только два типа записей. Все данные хранятся с типом CNote. Когда выбран элемент детализации для отображения на iPad, я загружаю эти данные в одну запись введите ActiveNote. Данные ActiveNote используются только iPad для заполнить его только для чтения версию подробного представления. IPad динамически изменяется всякий раз, когда пользователь телефона помечает запись как активную.

Все поля загружены и правильно отображаются на iPad с исключение актива для изображения. Активы не сохранены и я не получаю Сообщения об ошибках. Процедура сохранения для обычных CNotes использует тот же процедура, но начинается с изображения с камеры, которое я уменьшаю в размер. Это, конечно, UIImage. Я не могу получить спасение от этого изображения. Если я изменю код для загрузки статического .png, включенного в приложение, Загрузка работает правильно. Это только при попытке загрузить изображение из DetailViewController. Поскольку изображение изначально является активом во всяком случае, я попытался перезагрузить образ CKAsset непосредственно в ActiveNote и это тоже не работает.

Любое руководство будет оценено. Вот код для сохранения в единую ActiveNote. iOS 11, Xcode 9.3

func queryActiveNote() {

    recordZone = CKRecordZone(zoneName: "CNotes")

    let query = CKQuery(recordType: "ActiveNote", predicate: NSPredicate(format: "TRUEPREDICATE"))
    let sortDescriptor = NSSortDescriptor(key: "noteName", ascending: true)
    query.sortDescriptors = [sortDescriptor]

    privateDatabase.perform(query, inZoneWith: recordZone?.zoneID) { (results, error) in
        if error != nil {
            print("error querying database\(String(describing: error?.localizedDescription))")
        } else {

            guard results?.count > 0 else {return}
            print("results?.count is \(String(describing: results?.count))")

            self.activeNote = results![0]

            self.activeNote!["noteName"] = self.detailItem?["noteName"]

            //save a bunch of other fields too

            let tmpDir = NSTemporaryDirectory()
            let tmpFile = tmpDir.appending("test.png")
            let tmpFileURL = URL(fileURLWithPath: tmpFile)

            //Main queue to avoid runtime warning that image needs to be on main thread
            DispatchQueue.main.async {
                guard let tmpImage = self.imageView.image else {
                    print("guard let tmpImage failed")
                    return
                }

                guard let tmpImageData = UIImageJPEGRepresentation(tmpImage, 1.0) else {
                    print("guard let tmpImageData failed")
                    return
                }

                do {
                    try tmpImageData.write(to: tmpFileURL, options: .atomic)
                    print("the write of chosenImageData succeeded")
                } catch {
                    print("error writing chosenImageData to a file")
                }//do catch

                let asset : CKAsset = CKAsset(fileURL: tmpFileURL)
                self.activeNote!["noteImageData"] = asset

            }//main

            self.privateDatabase.save(self.activeNote!, completionHandler: { (record, error) in
                if error != nil {
                    print("privateDatabase error saving activeNote: \(String(describing: error?.localizedDescription))")
                } else {
                    print("modified activeNote record saved successfully")

                    DispatchQueue.main.async {
                        let ac = UIAlertController(title: nil , message: "Record was successfully saved as Active", preferredStyle: .alert)
                        let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil)
                        ac.addAction(okAction)
                        self.present(ac, animated: true, completion: nil)
                    }//main

                }//if error else
            })//save block

        }//if error else
    }//perform query block

}//queryActiveNote

1 Ответ

0 голосов
/ 08 мая 2018

пользователь3069232 должен получить кредит за ответ. Код выше сохраняет запись в CloudKit до завершения сохранения файла изображения. я переехал блок сохранения CloudKit внутри блока do catch, и процесс успешный. Так как я гарантированно имею изображение во всех записях (там по умолчанию), а затем сохранение CloudKit в зависимости от наличия успешное сохранение изображения в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...