Ios Firebase出现问题。在Swift中发生了更改

Ios Firebase出现问题。在Swift中发生了更改,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我使用Firebase保存用户配置文件信息。因为您无法侦听存储引用,所以我在数据库中添加了一个子项,每当用户更改其配置文件时,该子项都会更改(只是一个随机生成的UUIString。我验证了它确实在firebase中更改,并且新的子项与其他子项位于同一位置。每当用户更改其信息时,查看该配置文件的用户都应该看到更改,因此我测试了此项。即使子项正在更改,配置文件pic也没有更改。但是,如果用户更改了另一条信息,我用bio对其进行了测试,配置文件将随最新配置文件pic一起更新。代码的中调试版本如下:

我使用Firebase保存用户配置文件信息。因为您无法侦听存储引用,所以我在数据库中添加了一个子项,每当用户更改其配置文件时,该子项都会更改(只是一个随机生成的UUIString。我验证了它确实在firebase中更改,并且新的子项与其他子项位于同一位置。每当用户更改其信息时,查看该配置文件的用户都应该看到更改,因此我测试了此项。即使子项正在更改,配置文件pic也没有更改。但是,如果用户更改了另一条信息,我用bio对其进行了测试,配置文件将随最新配置文件pic一起更新。代码的中调试版本如下:

    let ref = DatabaseReference.allUsers.reference()
    let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (user.uid))

    query.observe(.childChanged, with: { snapshot in
        let user = User(dictionary: snapshot.value as! [String : Any])
        self.user = user
        self.bio.text = user.bio
        self.user?.fullName = user.fullName
        self.user?.instagram = user.instagram
        self.user?.facebook = user.facebook
        self.user?.phone = user.phone
        self.user?.email = user.email

    })

    //let ref2 = DatabaseReference.users(uid: user.uid).reference()
    //let query2 = ref2.child("updatePic")

    query.observe(.childChanged, with: { snapshot in
        let user = User(dictionary: snapshot.value as! [String : Any])

        self.user?.downloadProfilePicture { [weak self] (image, error) in
            self?.profilePicture.image = image
            let profilePictureKey = "\(user.uid)-headerImage"
            self?.cache?.setObject(image, forKey: profilePictureKey)
        }
    })
到目前为止,我一直在挠头,因为我不知道我可能会错过什么。基本上,即使我亲眼目睹孩子的变化,它也没有意识到孩子已经改变了。有什么想法吗

更新:是否可能在触发childChanged时,配置文件照片尚未完成更新,因此正在下载相同的照片?这是我当前更改照片的代码:

    extension FIRImage {
func saveProfileImage(_ userUID: String, _ completion: @escaping (Error?) -> Void) {
    let resizedImage = image.resized()
    let imageData = UIImageJPEGRepresentation(resizedImage, 1.0)

    ref = StorageReference.profileImages.reference().child(userUID)
    downloadLink = ref.description

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
    }
    updateProfilePic(userUID)
    }
    func updateProfilePic(_ userUID: String) {
    var randomString = UUID().uuidString
    let ref = DatabaseReference.users(uid: userUID).reference()
    ref.child("updatePic").setValue(randomString)
}

我不完全确定这是否是你的问题的原因,但是你应该考虑把你的用户存储在这样的结构中:

users: {
  uid1: {
    name: "Sudacris"
    profilePic: "https://www.gravatar.com/avatar/60fa08515b157ef927d885a4217c0f76?s=32&d=identicon&r=PG&f=1"
  },
  uid1: {
    name: "Frank van Puffelen"
    profilePic: "https://www.gravatar.com/avatar/12d378e6a9788ab9c94bbafe242b82b4?s=48&d=identicon&r=PG"
  }
}
这允许您无需查询即可查找特定用户。您只需执行直接查找:

let ref = DatabaseReference.allUsers.reference()
let userRef = ref.child(user.uid)

userRef.observe(.value, with: { snapshot in
   let user = User(dictionary: snapshot.value as! [String : Any])
   ...

我需要把我的updateProfilePic放在saveProfileImage函数的完成块中。

是的,它没有真正的帮助。这就像你是一个机械师,我把我的大众汽车带到你身边,你说“你可能应该换一辆奔驰”@Sudacris没有。这更像是,如果他是一名谷歌工程师,你把你的代码拿给他,他说“这是一个愚蠢的简单解决方案”