请查看以下代码。 varable v
从Firebase数据库中获取某种String
,然后打印出来。
var v = "no"
let ref = FIRDatabase.database().reference()
ref.child("db").observeSingleEventOfType(.Value, withBlock: {snapshot in
v = snapshot.value!["blah"] as! String//assume it gets "ok"
print("This one shouldn't come first")
})
print("v is \(v)!!")
.observeSingleEventOfType()
中的实际代码更复杂,但这个代码没问题。
在该方法中,变量v
获得String
。但是print语句不会打印"ok"
而是"no"
,因为该方法是异步的。
我想要做的是从.observeSingleEventOfType()
获得一个信号或类似的信号,表明它已经完成了所有代码行的执行,然后执行print()
方法。
有可能做我想要的吗?或者我可以暂停所有代码,直到代码块结束?
答案 0 :(得分:0)
completionBlocks:
本身就是一种信号,表明你的方法或函数已经完成了这样的功能
func printData(){
retrieveData{(retrievedBlah) in
print(retrievedBlah) //"Ok"
}
}
func retrieveData(completionBlock : ((blah : String!) -> Void)){
ref.child("db").observeSingleEventOfType(.Value, withBlock: {snapshot in
v = snapshot.value!["blah"] as! String//assume it gets "ok"
completionBlock(blah : v)
print("This one shouldn't come first")
})
}
但是如果您仍然想要检查您尝试存储在DB中的值是否已保存,请按照以下方式使用eventType监听该节点: -
案例ChildAdded // 0,在将新子节点添加到某个位置时触发
case ChildRemoved // 1,从某个位置删除子节点时触发
case ChildChanged // 2,在某个位置的子节点发生变化时触发
case ChildMoved // 3,当子节点相对于某个位置的其他子节点移动时触发
案例值// 4,在某个位置发生任何数据更改时触发,并递归地触发任何子项
然后交叉检查是否存储......