尝试使用完成处理程序从 google firebase 获取数据时遇到问题
Having issue with getting data from google firebase trying to use completion handler
我正在尝试为我的 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 循环来获取所有数据,但它不起作用。它不会跳出循环并重新开始
我对 Firebase 不是很熟悉,我不确定你到底想完成什么,但是在完成处理程序中更新 counter
是行不通的。
如果您将日志语句放在 ifUserIsMemberFunc
的顶部,例如:print("counter: \(counter)")
,您可能会对输出结果感到惊讶。
如果我没看错你的代码,你基本上就有了一个无限循环,它创建 Firebase 查询来检查 child 在 1
是否存在。
如果您想 运行 并行查询这些查询,您需要将 counter += 1
放在完成块的 之外。但是,您需要等待所有查询完成。 (DispatchGroup
是一个不错的选择。)
如果您想做其他事情,还有其他选择。希望这对您有所帮助!
您的代码添加了一些内容。应该工作
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 数据库中的一些数据创建一个完成处理程序。我正在尝试使用 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 循环来获取所有数据,但它不起作用。它不会跳出循环并重新开始
我对 Firebase 不是很熟悉,我不确定你到底想完成什么,但是在完成处理程序中更新 counter
是行不通的。
如果您将日志语句放在 ifUserIsMemberFunc
的顶部,例如:print("counter: \(counter)")
,您可能会对输出结果感到惊讶。
如果我没看错你的代码,你基本上就有了一个无限循环,它创建 Firebase 查询来检查 child 在 1
是否存在。
如果您想 运行 并行查询这些查询,您需要将 counter += 1
放在完成块的 之外。但是,您需要等待所有查询完成。 (DispatchGroup
是一个不错的选择。)
如果您想做其他事情,还有其他选择。希望这对您有所帮助!
您的代码添加了一些内容。应该工作
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
}
}
像这样。你应该明白了。
希望对您有所帮助