Ios 当Firebase函数在Swift中结束时
我在我的应用程序中使用了Firebase,它通过许多用户进行查询并获取所需的特定数据,但当它开始查询时,其余功能也会继续运行,而不仅仅是查询,因此我无法理解它何时结束 例如,在本代码中:Ios 当Firebase函数在Swift中结束时,ios,swift,xcode,firebase,firebase-realtime-database,Ios,Swift,Xcode,Firebase,Firebase Realtime Database,我在我的应用程序中使用了Firebase,它通过许多用户进行查询并获取所需的特定数据,但当它开始查询时,其余功能也会继续运行,而不仅仅是查询,因此我无法理解它何时结束 例如,在本代码中: ref.observeEventType(.ChildAdded, withBlock: { snapshot in let user = snapshot.value!.objectForKey("User") let name = (user!["Name"
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
将位于nameusers之间的某个位置,具体取决于您的internet连接-但它不会是最后一个)Firebase回调块是异步的,而打印行是同步的。这意味着,每当块从其基线API调用接收回数据时,它都将运行,而块外部的“打印”(和其他)行将继续按顺序运行
这就是为什么在运行回调块之前运行打印行。您可以使用dispatch group,但前提是必须使用,并且不应该在主线程上使用 看起来是这样的:
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")
让我们从分析代码开始:
- firebase观察功能是异步的
- 打印功能是同步的 结果:不可能强制asyc func以同步方式工作
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)")
})
这将为检索到的每个子级打印用户和名称这是异步函数调用back@WeiJay但是,当Firebase函数结束时,我能做些什么来运行另一个代码吗?你确切知道有多少回调(用户)?@WeiJay没有,但每次都在增长。添加一个孩子后,你打算做什么?或者你想在添加所有子项后做些什么?你是100%正确的,但是当Firebase函数结束时,我可以做些什么来运行另一个代码吗?