¿Cómo recibir una image de cloudkit?

Estoy usando este código para almacenar una image en icloud, pero ¿qué código uso para volver a crearlo y ubicarlo en un UIImageView? Lo he intentado todo, ¿pero no funciona?

func SaveImageInCloud(ImageToSave: UIImage) { let newRecord:CKRecord = CKRecord(recordType: "ImageRecord") let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) { if paths.count > 0 { if let dirPath = paths[0] as? String { let writePath = dirPath.stringByAppendingPathComponent("Image2.png") UIImagePNGRepresentation(ImageToSave).writeToFile(writePath, atomically: true) var File : CKAsset? = CKAsset(fileURL: NSURL(fileURLWithPath: writePath)) newRecord.setValue(File, forKey: "Image") } } } if let database = self.privateDatabase { database.saveRecord(newRecord, completionHandler: { (record:CKRecord!, error:NSError! ) in if error != nil { NSLog(error.localizedDescription) } else { dispatch_async(dispatch_get_main_queue()) { println("finished") } } }) } 

Simplemente lea el CKRecord que escribió y puede get el CKAsset leyendo la image key. Puede get un UIImage usando el código a continuación.

 var File : CKAsset? = record.objectForKey("Image") func image() -> UIImage? { if let file = File { if let data = NSData(contentsOfURL: file.fileURL) { return UIImage(data: data) } } return nil } 

Primero debe tener una forma de encontrar el ImageRecord específico que desea recuperar. Suponiendo que tiene RecordID para el ImageRecord que guardó (puede get esto del logging en el bloque de finalización saveRecord), puede hacer lo siguiente:

 if let database = privateDatabase { database.fetchRecordWithID(recordID, completionHandler: { (record, error) -> Void in guard let record = record else { print("Error retrieving record", error) return } guard let asset = record["Image"] as? CKAsset else { print("Image missing from record") return } guard let imageData = NSData(contentsOfURL: asset.fileURL) else { print("Invalid Image") return } let image = UIImage(data: imageData) imageView.image = image }) } 

(Aunque definitivamente querría estar haciendo algún tipo de event handling errores donde esos print() s)

Si no guarda el recordID (o probablemente mejor: el recordID.recordName para poder hacer otro CKRecordID más adelante), necesitará alguna otra forma de encontrar qué logging está buscando. Si ese es el caso, desearía search en el CKDatabase performQuery(_:inZoneWithID:completionHandler:) .

Después de download el CKAsset, necesitamos convertir el CKAsset a un UIImage. Podemos usar la siguiente extensión (código Swift 4):

 extension CKAsset { func toUIImage() -> UIImage? { if let data = NSData(contentsOf: self.fileURL) { return UIImage(data: data as Data) } return nil } }