在Firebase中,我可以从.observeSingleEventOfType()获取它已完成执行其代码块的信号吗?

时间:2016-09-10 18:30:08

标签: ios swift asynchronous firebase firebase-realtime-database

请查看以下代码。 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()方法。

有可能做我想要的吗?或者我可以暂停所有代码,直到代码块结束?

1 个答案:

答案 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,在某个位置发生任何数据更改时触发,并递归地触发任何子项

然后交叉检查是否存储......