尝试使用完成处理程序从 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 获取数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
无法从 PHP Google App Engine 与 *.roblox.com 通信
使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换
从 Java Script (TVML) 调用带有完成处理程序的 Swift 函数