我正在尝试为我的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循环来获取所有数据,但它无法正常工作。它不会脱离循环而重新开始
答案 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
}
}
像这样的东西。你应该明白这个想法。
希望有所帮助