2015-04-02 47 views
6

如何使用swift上傳和加載雲工具包中的圖像?如何使用swift上傳圖片與雲套件?

我使用什麼屬性類型?

我用什麼代碼?這是我目前使用的代碼...

func SaveImageInCloud(ImageToSave: UIImage) { 
     let newRecord:CKRecord = CKRecord(recordType: "ImageRecord") 
     newRecord.setValue(ImageToSave, 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") 

        } 
       } 
     }) 
     } 

回答

3

您需要創建一個CKAsset並將其添加到您的記錄中。你可以用這樣的代碼來做到這一點:

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

您需要在儀表板中爲該值選擇資產值類型。

newRecord.setValue(ImageToSave, forKey: "Image")

的UIImage不在CKRecord所允許的類型。您最好的選擇是將該圖像寫入文件,然後創建一個CKAsset並將其設置在記錄中。

+0

我會怎麼做,在代碼? – 2015-04-02 16:43:41

1

這裏的東西類似於埃德溫的答案,但更緊湊一點。我已經測試過它,它運作良好。

本示例將「myImage」UIImageView保存到「mySaveRecord」CKRecord中,只需將它們替換爲相應的名稱即可。

let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String 
let imageFilePath = documentDirectory.stringByAppendingPathComponent("lastimage") 
UIImagePNGRepresentation(myImage).writeToFile(imageFilePath, atomically: true) 
let asset = CKAsset(fileURL: NSURL(fileURLWithPath: imageFilePath)) 
mySaveRecord.setObject(asset, forKey: "ProfilePicture") 
CKContainer.defaultContainer().publicCloudDatabase.saveRecord(mySaveRecord, completionHandler: { 
    record, error in 
    if error != nil { 
     println("\(error)") 
    } else { 
     //record saved successfully! 
    } 
}) 
0

這個答案可與雨燕2.2 &的iOS 9,從上傳分隔文件的創建,這樣就可以正確地測試對陣雙方,因爲他們是用自己的潛在問題,不同的動作。

對於uploadPhoto函數,recordType變量是您在CloudKit儀表板中使用的值。 photo["photo"] = asset行中的「照片」鍵是記錄類型的字段名稱。

func uploadPhoto(image: UIImage, recordName: String) { 
    let privateDB = CKContainer.defaultContainer().privateCloudDatabase 
    let photoID = CKRecordID(recordName: recordName) 
    let photo = CKRecord(recordType: recordType, recordID: photoID) 
    let asset = CKAsset(fileURL: writeImage(image)) 
    photo["photo"] = asset 

    privateDB.saveRecord(photo) { (record, error) in 
     guard error == nil else { 
      print(error?.localizedDescription) 

      return 
     } 
     print("Successful") 
    } 
} 

func writeImage(image: UIImage) -> NSURL { 
    let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! 
    let fileURL = documentsURL.URLByAppendingPathComponent(NSUUID().UUIDString + ".png") 
    if let imageData = UIImagePNGRepresentation(image) { 
     imageData.writeToURL(fileURL, atomically: false) 
    } 

    return fileURL 
} 

您可以通過以下稱之爲:

uploadPhoto(UIImage(named: "foo.png")!, recordName: "bar")