我有一个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
答案 0 :(得分:0)
user3069232应该得到答案。上面的代码确实保存 在映像文件保存完成之前到CloudKit的记录。我搬家了 do catch块中的CloudKit保存块和进程是 成功的。因为我保证在所有记录中都有一个图像(那里 是一个默认值)然后使CloudKit保存条件有一个 成功保存图像。