【问题标题】:Firebase function in firebase functionfirebase函数中的firebase函数
【发布时间】:2018-01-02 16:35:17
【问题描述】:

以下函数必须返回我所有用户的好友列表。然而,它只为其中一个朋友做。我知道这是因为 2 个 firebase 函数正在异步运行,但是我不确定我必须更改函数以使其按应有的方式运行。即检索所有好友。

///retrieves all of user's friends
    func fetchFriends(completion: @escaping ([FriendModel])->()){
        FRIEND_REQ_REF.child(CURRENT_USER_ID).observe(.childAdded, with: {(snapshot) in
            var friends = [FriendModel]()
            if snapshot.value as? Int == 0 {
                self.USERS_REF.child(snapshot.key).observeSingleEvent(of: .value, with: {(snap) in
                    if let dictionary = snap.value as? [String : AnyObject]{
                        let friend = FriendModel()
                        friend.setValue(dictionary["userName"], forKey: "userName")
                        friend.setValue(dictionary["name"], forKey: "name")
                        friends.append(friend)
                        completion(friends)
                    }
                })
            }
        })
    }

这是我的数据结构:

FRIEND_REQ_REF
              firebaseUserID
                 friendFirebasegivenID : 0
                 anotherFriendFirebasegivenID : 0
USERS_REF
            friendFirebasegivenID
                 userName : String 
                 name : String 
            anotherFriendFirebasegivenID : 0
                 userName : String 
                 name : String 

【问题讨论】:

  • 我认为通过使用 observeSingleEvent 您不是从服务器中提取数据,而是从本地缓存中提取数据。尝试使用观察或查看 keepSynced。
  • 这实际上不是问题。那部分工作正常。这个函数的作用是从 FRIENDS_REQ_REF 中提取用户的所有朋友,然后根据他们的用户名提取他们的快照值。问题是一开始它必须拉动所有用户,它只做一个。我想我需要像 for 循环这样的东西来处理所有快照值,但是没有这样的东西,所以我不知道如何解决这个问题
  • 我看错了你的代码。一旦你拉出 FRIEND_REQ_REF,下面的所有数据也应该被拉出。无需再次从火力基地拉出。删除代码,只需执行 print(snapshot.value) 即可查看结构。它应该是一本包含一切的字典。
  • 实际上,一旦我拉出friend_req_ref,它就不会拉出所有数据。我也需要第二部分。看,我正在做的是从一个节点中找到当前用户的朋友,然后在另一个节点中查找他们的信息,称为 urers_ref 节点。我想我也应该对我的数据结构做一个图表,我会编辑它
  • 你能打印(snapshot.value)并发布吗?我需要查看正在返回的结构

标签: swift firebase asynchronous firebase-realtime-database data-synchronization


【解决方案1】:
///retrieves all of user's friends
    func fetchFriends(completion: @escaping ([FriendModel])->()){
        FRIEND_REQ_REF.child(CURRENT_USER_ID).observe(.value, with: {(snapshot) in
            var friends = [FriendModel]()

            if let dict = snapshot.value as? [String : AnyObject] {
                for (_,k) in dict.enumerated() {

                    if k.value == 0 {

                        self.USERS_REF.child(k.key).observeSingleEvent(of: .value, with: {(snap) in
                    if let dictionary = snap.value as? [String : AnyObject]{
                        let friend = FriendModel()
                        friend.setValue(dictionary["userName"], forKey: "userName")
                        friend.setValue(dictionary["name"], forKey: "name")
                        friends.append(friend)
                        completion(friends)
                    }
                })
                    }


                }
            }

        })
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2021-09-23
    • 2019-02-24
    • 2020-02-12
    • 1970-01-01
    • 2021-04-21
    • 2018-07-20
    相关资源
    最近更新 更多