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

Posted

技术标签:

【中文标题】尝试使用完成处理程序从 google firebase 获取数据时遇到问题【英文标题】:Having issue with getting data from google firebase trying to use completion handler 【发布时间】:2017-04-26 18:28:02 【问题描述】:

我正在尝试为我的 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 循环来获取所有数据,但它不起作用。它不会退出循环并重新开始

【问题讨论】:

可以分享一下数据库结构吗? 【参考方案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
    

类似的东西。你应该明白了。

希望对你有帮助

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于尝试使用完成处理程序从 google firebase 获取数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Java Script (TVML) 调用带有完成处理程序的 Swift 函数

从firebase调用数据需要完成处理程序?

尝试从完成处理程序中的响应对象返回字符串[重复]

如何从 NSURLSessionDataTask 完成处理程序返回 NSData

如何从NSURLSessionDataTask完成处理程序返回NSData

完成处理程序 swift 3 从函数返回一个变量