【问题标题】:How to receive an image from cloudkit?如何从 cloudkit 接收图像?
【发布时间】:2015-06-15 09:13:41
【问题描述】:

我正在使用此代码将图像存储在 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")
                }
            }
        })
    }

【问题讨论】:

    标签: ios xcode swift icloud cloudkit


    【解决方案1】:

    只要阅读你写的CKRecord,你就可以通过阅读关键Image获得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
    }
    

    【讨论】:

      【解决方案2】:

      下载 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
          }
      }
      

      【讨论】:

        【解决方案3】:

        您必须首先找到要检索的特定 ImageRecord 的方法。假设您拥有已保存的 ImageRecord 的 RecordID(您可以从 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 所在的位置进行一些错误处理)

        如果您不保存 recordID(或者可能更好:recordID.recordName 以便您稍后可以创建另一个 CKRecordID),您将需要一些其他方法来查找您正在寻找的记录。如果是这种情况,您需要考虑使用 CKDatabaseperformQuery(_:inZoneWithID:completionHandler:) 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-26
          • 2020-02-08
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多