如何从 cloudkit 接收图像?
How to receive an image from cloudkit?
我正在使用此代码在 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")
}
}
})
}
只要读取你写的CKRecord,读取key 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
}
您必须首先找到您要检索的特定 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()
所在的位置进行一些错误处理)
如果您不保存 recordID(或者可能更好:recordID.recordName,这样您以后可以创建另一个 CKRecordID),您将需要一些其他方法来查找您要查找的记录。如果是这种情况,您需要研究使用 CKDatabase
的 performQuery(_:inZoneWithID:completionHandler:)
方法。
下载完CKAsset后,我们需要将CKAsset转换为UIImage。我们可以使用下面的扩展(Swift4代码):
extension CKAsset {
func toUIImage() -> UIImage? {
if let data = NSData(contentsOf: self.fileURL) {
return UIImage(data: data as Data)
}
return nil
}
}
我正在使用此代码在 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")
}
}
})
}
只要读取你写的CKRecord,读取key 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
}
您必须首先找到您要检索的特定 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()
所在的位置进行一些错误处理)
如果您不保存 recordID(或者可能更好:recordID.recordName,这样您以后可以创建另一个 CKRecordID),您将需要一些其他方法来查找您要查找的记录。如果是这种情况,您需要研究使用 CKDatabase
的 performQuery(_:inZoneWithID:completionHandler:)
方法。
下载完CKAsset后,我们需要将CKAsset转换为UIImage。我们可以使用下面的扩展(Swift4代码):
extension CKAsset {
func toUIImage() -> UIImage? {
if let data = NSData(contentsOf: self.fileURL) {
return UIImage(data: data as Data)
}
return nil
}
}