CKAsset 未保存到 CloudKit - 保存所有其他字段
Posted
技术标签:
【中文标题】CKAsset 未保存到 CloudKit - 保存所有其他字段【英文标题】:CKAsset not Saved to CloudKit - All other fields are saved 【发布时间】:2018-05-07 21:43:05 【问题描述】:我有一个 CloudKit 应用程序,它基本上是一个主细节设置 额外的功能。任何细节对象都可以标记为 ActiveNote。什么时候 该应用程序在 iPad 上,仅显示此 ActiveNote(无用户 相互作用)。该应用程序包括所有通知和订阅 私有数据库中自定义区域中的数据。该应用程序适用于 一个例外。
只有两种记录类型。所有数据都以 CNote 类型存储。 When a detail item is chosen to be shown on the iPad, I upload that data to a single record of 键入 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
【问题讨论】:
一个疯狂的猜测,但也许您将保存数据的代码放在 selectedImageData 成功的 do/catch 块中。显然,您也需要移动资产配置。我怀疑这是一个种族危险,保存到 icloud 的代码在文件保存之前执行。 【参考方案1】:user3069232 应该得到答案。上面的代码确实保存 在图像文件保存完成之前记录到 CloudKit。我搬家了 do catch 块内的 CloudKit 保存块,该过程是 成功的。因为我保证在所有记录中都有图像(有 是默认值)然后使 CloudKit 保存条件是具有 图片保存成功就ok了。
【讨论】:
以上是关于CKAsset 未保存到 CloudKit - 保存所有其他字段的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 使用 CKAsset 将图像发送到 CloudKit