2017-07-08 78 views
0

我使用Firebase来保存用户个人资料信息。因为你不能听存储引用,所以我在数据库中添加了一个子选项,每当用户改变他们的个人资料图片时(只是一个随机生成的uuidString),我确认它确实在firebase中发生了变化,并且新的孩子处于相同的状态作为其他用户的位置,每当用户更改他们的信息时,正在查看该用户信息的用户应该看到更改,因此我测试了这一点,即使孩子正在更改,也没有更改个人资料图片。但是,如果用户更改另一块信息,我与生物测试它,配置文件将更新,与最新的配置文件PIC沿码的中间调试版本低于:Swift中Firebase .childChanged的问题

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

回答

0

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

0

我不能完全肯定,如果这是你的问题的原因,但你绝对应该考虑将你的用户在这样的结构:

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]) 
    ... 
+0

是的,它并没有真正的帮助。这就好像你是一名机械师,并且我把我的大众带到了你身边,而你说“你应该有一辆梅赛德斯代替” – Sudacris