[英]When Firebase function ends in Swift
我在我的应用程序中使用Firebase,它查询大量用户并获取所需的特定数据,但是当它开始查询时-该功能的其余部分也保持运行,而不仅仅是查询,所以我无法理解当它结束时。
例如下面的代码:
ref.observeEventType(.ChildAdded, withBlock: { snapshot in
let user = snapshot.value!.objectForKey("User")
let name = (user!["Name"])! as! String
print("name")
})
print("done")
假设我们在Firebase数据库中有3个用户-打印的代码将是:
done
nameuser1
nameuser2
nameuser3
(或者done
将在名称用户之间进行,取决于您的互联网连接-但它不会是最后一个)
Firebase回调块是异步的,而打印行是同步的。 这意味着,只要该块从其底层API调用接收回数据,该块就将运行,而该块外部的“打印”(和其他)行将继续顺序运行。
这就是为什么在运行回调块之前先运行打印行的原因。
您可以使用调度组,但前提是必须这样做,并且不应该在主线程上使用它。
看起来像这样:
let group = dispatch_group_create()
dispatch_group_enter(group)
ref.observeEventType(.ChildAdded, withBlock: { snapshot in
let user = snapshot.value!.objectForKey("User")
let name = (user!["Name"])! as! String
print("name")
dispatch_group_leave(group)
})
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
//will reach here only after group_leave is called
print("done")
您遇到的“问题”是由于函数observeEventType()
是异步的。 因此,它会在实际获取值之前将控制权返回给其调用方。 使用这样的异步回调并传递一个函数,每次从firebase中检索值时都会调用该函数。
已为Swift 3更新
func getDataFromFirebase(callback: @escaping (_ user: String, _ name: String)->Void){
ref.observeEvent(of: .childAdded, with:{(snapshot)-> Void in
let user = snapshot.value!.objectForKey("User") as! String
let name = (user!["Name"])! as! String
callback(user, name)
})
}
然后像这样调用函数
getDataFromFirebase(callback: {(user, name)-> Void in
print("got a user: \(user) and a name: \(name)")
})
这将为检索到的每个孩子打印一个用户和一个名字
让我们开始分析您的代码:
打印功能是同步的
结果:不可能强迫一个asyc函数无法同步。
这只是一个错误的方法
关于编译器将如何编译您的代码:
首先,他将触发observeEventType函数,然后将其传递执行其他内容(这是因为它是异步的,需要时间来完成执行)。
对于您以所需方式进行这项工作的我的建议是,在viewDidLoad()函数中准备所有需要的数据(将它们放入变量中),而不仅仅是在私有函数中使用这些变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.