从谷歌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循环来获取所有数据,但它不工作。它不会从循环中出来,并开始通过
答
你的代码有一些增加。应工作
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
是个不错的选择。)
如果你想做别的事情,还有其他的选择。希望这可以帮助!
你能分享数据库结构吗? –