如何观察firebase存储的更改并实时更新viewcontroller?

时间:2017-11-07 09:42:04

标签: ios swift firebase firebase-storage

我正在构建一个应用,用户可以使用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")

1 个答案:

答案 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
})