У меня есть приложение 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