【发布时间】:2020-08-24 01:22:53
【问题描述】:
我一直在网上到处寻找以帮助我,但我无法弄清楚这一点。下面的代码表示允许图像在用户注册时存储在 firebase 数据库中:
func uploadProfileImage(_ image: UIImage, completion: @escaping ((_ url: URL?)->())){
guard let uid = Auth.auth().currentUser?.uid else {return}
let storageRef = Storage.storage().reference().child("user/\(uid)")
guard let imageData = image.jpegData(compressionQuality: 0.75 ) else {return}
let metaData = StorageMetadata()
metaData.contentType = "image/jpg."
storageRef.putData(imageData, metadata: metaData) { metaData, error in
if error == nil, metaData != nil {
storageRef.downloadURL { url, error in
completion(url)
// success!
}
} else {
// failed
completion(nil)
}
}
}
func saveProfile(name: String, email: String, profileImageURL: URL, completion: @escaping ((_ success:Bool)->())){
guard let uid = Auth.auth().currentUser?.uid else {return}
let databaseRef = Database.database().reference().child("users/profile/\(uid)")
let userObject = ["name":name, "email":email,
"photoURL":profileImageURL.absoluteString] as [String:Any]
databaseRef.setValue(userObject) {error, ref in completion(error == nil)}
}
}
另一个 .swift 文件中的这段代码让我可以获取照片:
static let cache = NSCache<NSString, UIImage>()
static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
var downloadedImage:UIImage?
if let data = data {
downloadedImage = UIImage(data: data)
}
if downloadedImage != nil {
cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
}
DispatchQueue.main.async {
completion(downloadedImage, url)
}
}
dataTask.resume()
}
static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
if let image = cache.object(forKey: url.absoluteString as NSString) {
completion(image, url)
} else {
downloadImage(withURL: url, completion: completion)
}
}
用户个人资料代码:
class UserProfile {
var uid:String
var name:String
var photoURL:URL
init(uid:String, name:String, photoURL:URL){
self.uid = uid
self.name = name
self.photoURL = photoURL
}
}
我添加了一个文件,可以让我从 firebase 获取数据:
class ImageServices{
static let cache = NSCache<NSString, UIImage>()
static func downloadImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
let dataTask = URLSession.shared.dataTask(with: url) { data, responseURL, error in
var downloadedImage:UIImage?
if let data = data {
downloadedImage = UIImage(data: data)
}
if downloadedImage != nil {
cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
}
DispatchQueue.main.async {
completion(downloadedImage, url)
}
}
dataTask.resume()
}
static func getImage(withURL url:URL, completion: @escaping (_ image:UIImage?, _ url:URL)->()) {
if let image = cache.object(forKey: url.absoluteString as NSString) {
completion(image, url)
} else {
downloadImage(withURL: url, completion: completion)
}
}
}
现在我如何在我的 viewController 中使用它来在 imageView 上实际显示图像???
【问题讨论】:
-
问题不清楚。 viewControllers 没有个人资料页面,所以也许这是您添加到 your viewController 的内容?另外,您是在询问 Firebase 用户对象的
.photoUrl属性吗?或者您是在问如何从 Firebase 中读取节点 /photoURL 节点?如果您尝试读取 Firebase 节点的值,请参阅入门指南 Read Data。我建议您对其进行审查,然后澄清并更新您的问题。 -
我要问的是如何从当前登录的用户那里获取图像并将其附加到我已命名为我的个人资料页面的不同视图控制器中的图像。
-
如果你想获取头像,你会从当前用户对象中获取profileUrl。见Get A Users Profile。知道 URL 或拥有图像后,您就可以在应用程序中的任意位置使用它。
-
这在代码中会是什么样子,因为我在网站上没有完全理解它抱歉。这必须适用于已登录的任何人。我添加了一个 userProfile 以获取配置文件 url,如编辑后的问题所示。
-
您可以这样做,但 Firebase 为当前用户提供了 photoUrl 属性,为什么不使用它呢?然后任何时候你想显示,
let photoUrl = Auth.auth().currentUser.photoUrl然后查看this question 的答案以下载和填充 imageView。另一方面,它可以向自己显示用户图像,但如果您希望其他人看到图像,则可以按照您的问题中的建议将 url 保存在 /users/uid_x/profileUrl 中。不知道问题到底是什么。
标签: swift firebase firebase-realtime-database firebase-storage