我试图从firebase调用数据。问题是,数据是深层嵌套的,我认为我无法更改。

因此,我尝试从firebase调用值,然后可以将其用于引用新值。
当我的for循环在调用下一个阶段之前未完成时,就会出现问题,这意味着下一个阶段的字典计数为0,因此不调用下一个函数吗?

有没有办法做到这一点?

请帮忙?

这是我的代码:

func fetchBuyer(search: String, user: String, completion: @escaping ([Post]) -> (), withCancel cancel: ((Error) -> ())?) {
    let ref = Database.database().reference().child("posts").child(user).child(search).child("purchases")
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionaries = snapshot.value as? [String: Any] else {
            completion([])
            return
        }

        let keys: [String] = dictionaries.map({ $0.key })
        var newdictionaries = [String: String]()

        for i in keys {
            let newref = Database.database().reference().child("posts").child(user).child(search).child("purchases").child(i).child("purchaser")
            newref.observeSingleEvent(of: .value, with: { (snapshot) in
                newdictionaries[i] = snapshot.value as? String
                print("THESE ARE MY PURCHASES ID-->", newdictionaries.values)///prints out ["-M0pTHtZXYUVQT7DCLj-", "-M0pU79uQCCnBunAEkJN"]
            })
        }

        var buyerPosts = [Post]()
        print("newdictionaries.count--->", newdictionaries.count)//this print is 0
        newdictionaries.forEach({ (postId, value) in
            Database.database().fetchPost(withUID: user, postId: postId, completion: { (post) in
                buyerPosts.append(post)
                if buyerPosts.count == newdictionaries.count{
                    completion(buyerPosts)
                }
            })
        })
    }) { (err) in
        print("Failed to fetch posts for buyers:", err)
        cancel?(err)
    }
}

尝试的答案:
            let g = DispatchGroup()  //// 1
           for i in keys{
               g.enter()   //// 2
               let newref = Database.database().reference().child("posts").child(user).child(search).child("purchases").child(i).child("purchaser")
            print("now")
            newref.observeSingleEvent(of: .value, with: { (snapshot)
                       newdictionaries[i] = snapshot.value as? String
                        print("print new dictionaries-->", newdictionaries)
                       // complete here
                Database.database().fetchPost(withUID: user, postId: newdictionaries[i]!, completion: { (post) in
                                buyerPosts.append(post)
                                g.leave() //////// 3
                         })
                    })
             }
         g.notify(queue: DispatchQueue.main) {
            print("finished!!!")
           completion(buyerPosts)
         }

最佳答案

您需要一个调度组并嵌套 call

    let g = DispatchGroup()  //// 1

    for i in keys{
        g.enter()   //// 2
        let newref = Database.database().reference().child("posts").child(user).child(search).child("purchases").child(i).child("purchaser")
             newref.observeSingleEvent(of: .value, with: { (snapshot)
                newdictionaries[i] = snapshot.value as? String
                // complete here
                    Database.database().fetchPost(withUID: user, postId: postId, completion: { (post) in
                         buyerPosts.append(post)
                         g.leave() //////// 3
                  })

             })
      }

 /// 4
  g.notfiy(queue.main) {
    completion(buyerPosts)
  }

10-07 16:40
查看更多