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

CloudKit 的 CKasset 文件大小限制

播放通过 CloudKit 作为 CKAsset 下载的视频 - iOS

从核心数据中保存 CKAsset

Xcode:CloudKit 中的 CKAsset

在 CloudKit 中将图像存储为 CKAsset,图像倒置