Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用swift使用云工具包上传图像?_Ios_Xcode_Swift_Icloud_Cloudkit - Fatal编程技术网

Ios 如何使用swift使用云工具包上传图像?

Ios 如何使用swift使用云工具包上传图像?,ios,xcode,swift,icloud,cloudkit,Ios,Xcode,Swift,Icloud,Cloudkit,如何使用swift从云工具包上传和加载图像 我使用什么属性类型 我使用什么代码?这是我目前使用的代码 func SaveImageInCloud(ImageToSave: UIImage) { let newRecord:CKRecord = CKRecord(recordType: "ImageRecord") newRecord.setValue(ImageToSave, forKey: "Image") if let database =

如何使用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")

                    }
                }
        })
        }

您需要在仪表板中为此值选择资产值类型

newRecord.setValue(ImageToSave,forKey:“Image”)


UIImage不是
CKRecord
上允许的类型。您最好的选择是将此图像写入文件,然后创建一个
CKAsset
,并将其设置在记录上。

您需要创建一个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")
                }
            }
        })
    }

这里有一些类似于埃德温的答案,但更简洁。我已经测试过了,效果很好

本例将“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!
    }
})

此答案适用于Swift 2.2和iOS 9,并将文件创建与上载分开,以便您可以针对两者进行适当的测试,因为它们是具有自身潜在问题的不同操作

对于uploadPhoto函数,recordType变量是您在CloudKit仪表板中使用的值。
photo[“photo”]=asset
行中的“photo”键是记录类型的字段名

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

我在Swift 5中创建了这个小扩展,用于从
UIImage
转换到
CKAsset

extension UIImage {
    func toCKAsset(name: String? = nil) -> CKAsset? {
        guard let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else {
            return nil
        }

        guard let imageFilePath = NSURL(fileURLWithPath: documentDirectory)
                .appendingPathComponent(name ?? "asset#\(UUID.init().uuidString)")
        else {
            return nil
        }

        do {
            try self.pngData()?.write(to: imageFilePath)
            return CKAsset(fileURL: imageFilePath)
        } catch {
            print("Error converting UIImage to CKAsset!")
        }

        return nil
    }
}
然后,您可以在问题中使用它:

if let asset = ImageToSave.toCKAsset() {
    newRecord.setObject(asset, forKey: "Image")

    CKContainer.defaultContainer().publicCloudDatabase.saveRecord(newRecord, completionHandler: {
      record, error in
      if error != nil {
        println("\(error)")
      } else {
        // saved successfully!
      }
    })
}