如何观看Firebase存储的变化并实时更新视图控制器



我正在构建一个应用程序,用户可以在其中使用 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()

有没有人知道如何观察火基存储中的变化。

我只需使用

let imageRef = storage.child("images/(friendsManager.friends[indexPath.row].id).jpg")

据我所知,Firebase 不支持在存储模块中"监视更改"。解决此问题的最佳方法是将配置文件图像的URL存储在实时数据库中,然后侦听那里的更改并相应地下载图像。为每个图像使用随机生成的字符串,以确保它们是唯一的。像——

 _ = 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
})

最新更新