将资产列表(数组)保存到特定的CKRecord

我在CloudKit后端创build了一个CKRecordtypes,并且有一些与该类相关的属性。

我有string属性,字节,我有一个资产列表属性,所以存储一些图像(多个图像相关的单个logging)。

资产列表

现在我试图存储一些图像,然后填充该属性,然后尝试将其保存到CloudKit,但它不工作。

代码如下所示:

var images_array = [CKAsset]() // append the an image to the array images_array.append(CKAsset(fileURL: writeImage(image: selectedImage) as URL)) let record = CKRecord(recordType: recordName) record["class_title"] = someString as CKRecordValue record["class_body"] = someString as CKRecordValue record["images_array"] = images_array as CKRecordValue saveRecord(record) func saveRecord(_ xrecord: CKRecord) { let publicData = CKContainer.default().publicCloudDatabase let record: [CKRecord] = [xrecord] let saveOperation = CKModifyRecordsOperation.init(recordsToSave: record, recordIDsToDelete: nil) saveOperation.perRecordCompletionBlock = {(record, error) -> Void in if (error != nil) { print("error") } } publicData.add(saveOperation) } func writeImage(image: UIImage) -> URL { let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileURL = NSURL(fileURLWithPath: documentsURL.absoluteString).appendingPathComponent(".jpg") if let imageData = image.lowestQualityJPEGNSData { do { try imageData.write(to: fileURL!) } catch { print("ERRO 001 = \(error.localizedDescription)") } } return fileURL! } extension UIImage { var uncompressedPNGData: Data? { return UIImagePNGRepresentation(self) } var highestQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 1.0) } var highQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.75) } var mediumQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.5) } var lowQualityJPEGNSData: Data? { return UIImageJPEGRepresentation(self, 0.25) } var lowestQualityJPEGNSData:Data? { return UIImageJPEGRepresentation(self, 0.0) } } 

如果我只保存string,一切都完美的工作,但与图像不保存logging。

我知道可能有任何问题与追加,或者我必须以其他方式保存数组,或者我不应该将其保存为CKRecordValue。

你有关于如何实现这一点的任何提示?

谢谢

在创build本地资产文件时,应该使用primefaces写入选项。 这将确保文件在CloudKit尝试上载资源之前完全写入。

这是我在Seam 3库中使用的资产文件创buildfunction:

 fileprivate func createAsset(data: Data) -> CKAsset? { var returnAsset: CKAsset? = nil let tempStr = ProcessInfo.processInfo.globallyUniqueString let filename = "\(tempStr)_file.bin" let baseURL = URL(fileURLWithPath: NSTemporaryDirectory()) let fileURL = baseURL.appendingPathComponent(filename, isDirectory: false) do { try data.write(to: fileURL, options: [.atomicWrite]) returnAsset = CKAsset(fileURL: fileURL) } catch { print("Error creating asset: \(error)") } return returnAsset } 

你必须采取CKAssetarrays的图像。

 var imageUrls = [CKAsset]() 

现在使用for-loop获取所有图像。 并保存CKAsset的图像。

 for images in self.arrayImageSelected{ var myImage = UIImage() if (images.isKindOfClass(PHAsset)){ let imageC = images as? PHAsset myImage = self.getAssetThumbnail(imageC!) }else if (images.isKindOfClass(UIImage)){ myImage = (images as? UIImage)! } let imagePath = self.storeImageAtDocumentDirectory(myImage, titleName: self.strTitle) myPAth.append(imagePath) let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String let FbPath = paths.stringByAppendingString("/Custom") let filePathToWrite = "\(FbPath)" + imagePath let urls = NSURL(fileURLWithPath: filePathToWrite) let imageAsset = CKAsset(fileURL: urls) imageUrls.append(imageAsset) } 

设置你的数组。

 record.setObject(imageUrls, forKey: "images_array")