2015-04-09 2 views
3

Я использую этот код для хранения изображения в icloud, но какой код я использую для его ретрансляции и размещения в UIImageView? Я пробовал все, но это не сработает?Как получить изображение из облачного?

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") 
       } 
      } 
     }) 
    } 

ответ

9

Просто прочитайте CKRecord, что вы написали, и вы можете получить, прочитав CKAsset ключа изображения. Вы можете получить UIImage, используя приведенный ниже код.

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 
} 
1

Вам необходимо сначала найти определенный ImageRecord, который вы хотите получить. Если предположить, что у вас есть RecordID для ImageRecord вы спасены (вы можете получить это от записи в завершение блока saveRecord), вы можете сделать:

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 
    }) 
} 

(Хотя вы определенно хотите, чтобы делать некоторые обработки ошибок, где те, print() s are)

Если вы не сохраните recordID (или, вероятно, лучше: recordID.recordName, чтобы позже вы могли сделать другой CKRecordID), вам понадобится другой способ найти, какую запись вы ищете. Если это так, вы бы хотели изучить метод CKDatabaseperformQuery(_:inZoneWithID:completionHandler:).

1

После загрузки CKAsset нам необходимо преобразовать CKAsset в UIImage. Мы можем использовать следующее расширение (код Swift 4):

extension CKAsset { 
    func toUIImage() -> UIImage? { 
     if let data = NSData(contentsOf: self.fileURL) { 
      return UIImage(data: data as Data) 
     } 
     return nil 
    } 
} 
Смежные вопросы