将资产列表(数组)保存到特定的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 }
你必须采取CKAsset
arrays的图像。
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")