从谷歌Firebase获取数据尝试使用完成处理程序

问题描述:

我试图为我的Firebase数据库中的一些数据创建完成处理程序。我试图使用while循环,但没有发生。代码如下:在viewDidLoad中从谷歌Firebase获取数据尝试使用完成处理程序

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

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

//称这我试图用一个while循环来获取所有数据,但它不工作。它不会从循环中出来,并开始通过

+0

你能分享数据库结构吗? –

你的代码有一些增加。应工作

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

就像这样。你应该明白这个主意。

希望它有帮助

我不是很熟悉Firebase,我不确定你想要完成什么,但在完成处理程序中更新counter不会上班。

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

如果我正确地读取了您的代码,您基本上会有一个无限循环创建Firebase查询以检查1中是否存在子代。

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

如果你想做别的事情,还有其他的选择。希望这可以帮助!