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

时间:2017-04-26 18:28:02

标签: swift firebase swift3 firebase-realtime-database completionhandler

我正在尝试为我的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循环来获取所有数据,但它无法正常工作。它不会脱离循环而重新开始

2 个答案:

答案 0 :(得分:1)

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

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

如果我正确阅读您的代码,您基本上会创建一个无限循环来创建Firebase查询,以检查1处是否存在该子代。

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

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

答案 1 :(得分:1)

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

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

像这样的东西。你应该明白这个想法。

希望有所帮助