CKAsset未保存到CloudKit - 保存所有其他字段

时间:2018-05-07 21:43:05

标签: ios swift4 cloudkit

我有一个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 :(得分:0)

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