[英]Downloading Image, then Cache it from Firebase Swift 3
I'm currently trying to setup a user profile picture. 我目前正在尝试设置用户个人资料图片。 I have the User takes an image which is uploaded to Firebase, but I want to download that image and cache it.
我让用户拍摄上载到Firebase的图像,但是我想下载该图像并将其缓存。 I'm having problems with downloading it right now, after I get that fixed I will worry about caching it.
我现在无法下载它,在解决该问题之后,我将担心对其进行缓存。
// Uploading Images to Firebase
func uploadImageToFirebaseStorage(data: NSData ) {
let storageRef = FIRStorage.storage().reference(withPath: "myPics/profilePic.jpg")
let uploadMetaData = FIRStorageMetadata()
uploadMetaData.contentType = "image/jpeg"
let uploadTask = storageRef.put(data as Data, metadata: uploadMetaData) { (metadata, error) in
if (error != nil) {
print("I Received an error \(error?.localizedDescription)")
} else {
print("Upload Complete! Here is the MetaData \(metadata?.downloadURL())")
}
}
Now what I'm having problems with the Issue Navigator: 现在,我在问题导航器中遇到了什么问题:
It has this issue on reference = self.storage
. 在
reference = self.storage
上存在此问题。 Thank you in advance! 先感谢您!
//Download Image for User Profile Picture
func downloadImageUserFromFirebase() {
let storage = FIRStorage.storage()
var reference: FIRStorageReference!
reference = self.storage.referenceForURL("gs:URL.appspot.com")
reference.downloadURL { (url, error) in
let data = NSData(contentsOf: url!)
let image = UIImage(data: data! as Data)
self.profileImageView.image = image
}
}
Storage wasn't declared as a property of the class, it was declared within that method. 存储未声明为类的属性,而是在该方法中声明的。 Additionally, even if it was declared as a property of the class, in swift you don't need to put self before a class property any longer unless you are within a closure.
此外,即使已将其声明为类的属性,也可以迅速将自己置于类属性之前,除非您处于闭包内。
Either do: 要么做:
func downloadImageUserFromFirebase() {
let storage = FIRStorage.storage()
var reference: FIRStorageReference!
//all I did here was remove self before storage
reference = storage.referenceForURL("gs:URL.appspot.com")
reference.downloadURL { (url, error) in
let data = NSData(contentsOf: url!)
let image = UIImage(data: data! as Data)
self.profileImageView.image = image
}
}
Or, ideally, restructure the code: 或者,理想情况下,重组代码:
class ProfileViewController: UIViewController {
//here we are initializing it as a property of the class
let storage = FIRStorage.storage()
func downloadImageUserFromFirebase() {
var reference: FIRStorageReference = storage.referenceForURL("gs:URL.appspot.com")
reference.downloadURL { (url, error) in
//using a guard statement to unwrap the url and check for error
guard let imageURL = url, error == nil {
//handle error here if returned url is bad or there is error
return
}
guard let data = NSData(contentsOf: imageURL) else {
//same thing here, handle failed data download
return
}
let image = UIImage(data: data)
self.profileImageView.image = image
}
}
}
reference.downloadurl将识别当前用户的图像,否则我们应该将profileimageurl保存在数据库中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.