我正在构建一个应用,用户可以使用firebase服务(firebase存储)更新他的个人资料图片。
在我的应用中,用户可以有多个朋友,他的朋友的照片会显示在视图控制器中。
我想要实现的是,当用户更新他的个人资料图片时,他的所有朋友(使用其他设备连接)都会实时更改他的图像。
为此,我认为最简单的解决方案是观察存储中的变化。
以下是我用来上传用户图片的代码
let storage = FIRStorage.storage()
let storageref = storage.reference(forURL: "my firebase url")
let imageref = storageref.child("images")
let userid : String = (user.uid)
let spaceref = imageref.child("\(userid).jpg")
let imageConverter = ImageConverter()
var profilePicture : UIImage = imageConverter.cropToBounds(image: self.profilePicture.image!, width: 150 ,height: 150)
profilePicture = imageConverter.resizeImage(image: profilePicture, targetSize: CGSize(width: 140, height: 150))
let imageData = UIImagePNGRepresentation(profilePicture)
_ = spaceref.put(imageData!, metadata: nil){ metadata, error in
if (error != nil) {
loadingScreenViewController.view.removeFromSuperview()
self.alert(title: "Error", description: "please check your internet connection and try again")
}
else {
_ = metadata!.downloadURL
}
loadingScreenViewController.view.removeFromSuperview()
有没有人知道如何观察firebase存储中的更改。
我只需使用
即可获得图片let imageRef = storage.child("images/\(friendsManager.friends[indexPath.row].id).jpg")
答案 0 :(得分:2)
据我所知,Firebase不支持观看更改'在存储模块中。解决此问题的最佳方法是将URL存储到Realtime数据库中的配置文件映像,然后在那里监听更改并相应地下载映像。为每个图像使用随机生成的字符串,以确保它们是唯一的。像 -
这样的东西 _ = spaceref.put(imageData!, metadata: nil){ metadata, error in
if (error != nil) {
loadingScreenViewController.view.removeFromSuperview()
self.alert(title: "Error", description: "please check your internet connection and try again")
} else {
if let downloadUrl = metadata.downloadURL() {
let db = Database.database().reference()
db.child("profiles").child("myuserid").setValue(["photoUrl" : downloadUrl])
}
}
然后注意变化 -
profilesRef.observe(.childChanged, with: { (snapshot) -> Void in
// Download the image from the stored url
})