尝试使用完成处理程序从 google firebase 获取数据时遇到问题

Having issue with getting data from google firebase trying to use completion handler

我正在尝试为我的 firebase 数据库中的一些数据创建一个完成处理程序。我正在尝试使用 while 循环,但没有任何反应。代码如下:

func ifUserIsMember(counter: Int, completionHandler: @escaping ((_ exist : Bool) -> Void)) {
    let ref = FIRDatabase.database().reference()

    ref.child("Test").child("\(counter)").observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.exists(){
            let value = snapshot.value as? NSDictionary
            test1 = value?["cal1"] as! String
            test2 = value?["cal2"] as! String
            test3 = value?["cal3"] as! String
            completionHandler(true)
        }else{
            print("user is not a member of a team")
            completionHandler(false)
        }
    })
}

//在viewDidLoad中调用了这个

    var counter = 0
    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()
        while counter < 6 {
        ifUserIsMember(counter: counter + 1) { (exist) -> () in
            if exist == true {
                print("Found something")

                counter += 1
            }
            else {
                print("NO DATA")
            }
        }
      }

我正在尝试使用 while 循环来获取所有数据,但它不起作用。它不会跳出循环并重新开始

我对 Firebase 不是很熟悉,我不确定你到底想完成什么,但是在完成处理程序中更新 counter 是行不通的。

如果您将日志语句放在 ifUserIsMemberFunc 的顶部,例如:print("counter: \(counter)"),您可能会对输出结果感到惊讶。

如果我没看错你的代码,你基本上就有了一个无限循环,它创建 Firebase 查询来检查 child 在 1 是否存在。

如果您想 运行 并行查询这些查询,您需要将 counter += 1 放在完成块的 之外。但是,您需要等待所有查询完成。 (DispatchGroup 是一个不错的选择。)

如果您想做其他事情,还有其他选择。希望这对您有所帮助!

您的代码添加了一些内容。应该工作

 func ifUserIsMember(counter: Int, completionHandler: @escaping (_ exist : Bool) -> Void)) {
     let ref = FIRDatabase.database().reference()

     ref.child("Test").child("\(counter)").observeSingleEvent(of: .value, with: { (snapshot) in
         if snapshot.exists(){
            let value = snapshot.value as? NSDictionary
            test1 = value?["cal1"] as! String
            test2 = value?["cal2"] as! String
            test3 = value?["cal3"] as! String
            completionHandler(true)
        } else {
            print("user is not a member of a team")
            completionHandler(false)
        }
    })
}

//在viewDidLoad中调用了这个

var counter = 0
var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()

while counter < 6 {
    ifUserIsMember(counter: counter + 1,
                   completionHandler: { existing in
        if existing {
            print("Found something")
        } else {
            print("NO DATA")
        }
   })

   counter += 1 // or you will have infinite loop
}

如果你想加载一个对象数组,例如 tableView,你应该创建另一个带有完成处理程序的函数。像

// for example it will return [String]
func getAllObjects(completion: (_ hasFinished: [String]) -> Void) {
    var arrayToReturn = [String]()
    var countOfChecked = 0 
    while counter < 6 {
         ifUserIsMember(counter: counter + 1,
                        completionHandler: { existing in
             var countOfChecked += 1
             if existing {
                 print("Found something")
                 arrayToReturn(//append some data)
                 if countOfChecked == 6 { // its your number (6)
                     completion(arrayToReturn)
                 }
             } else {
                 print("NO DATA")
             }
         })

         counter += 1 // or you will have infinite loop
    }
}

像这样。你应该明白了。

希望对您有所帮助