2017-03-03 86 views
0

我读了一些关于这个问题。但我仍然有异步功能的问题。异步函数和Firebase与Swift 3

例如:我有一个viewController1其中一个按钮执行SEGUE到viewController2。在viewController2类中,我初始化另一个名为exampleClass的类文件中的一些值。这些值是从Firebase数据库或位置值中检索的。这些值需要一点时间来检索。我将exampleClass的值返回到我的viewController2。我在viewController2viewDidLoad()中打印这些值。

我的问题:设备不会等待检索值并执行以下功能。结果:当我触摸按钮时,打印值为nil值。如果我不确保代码安全,它也可能导致应用程序崩溃。

我到目前为止已经发现:我才知道,我只有在火力地堡snapshot(例如)这样的结尾调用FUNC:

userRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
     self.name = snapshot.value as! String! 
     print(self.name) 
     self.forceEnd() 
    }) { (error) in 
     print(error.localizedDescription) 
    } 

我命名这个功能forceEnd要清楚。这不适合我。我也尝试创建处理程序,但没有积极的结果。

我的问题:如何强制设备在执行以下问题之前等待检索值?

回答

1

如何强制设备在执行以下问题之前等待检索值?

  • 你不想设备等候,只需要执行一次这些值是从火力地堡数据库检索某些操作。
  • 执行异步操作可以通过多种方式来完成像blocksprotocolsnotifications

一般来说,块是更好的方法。
一些示例代码可以像:

func myFirebaseNetworkDataRequest(finished:() -> Void) { // the function thats going to take a little moment 

    ... 

    print("Doing something!") // firebase network request 

    finished()  
} 


// usage of above function can be as- 

override func viewDidLoad() { 

    myFirebaseNetworkDataRequest { 

      // perform further operations here after data is fetched 
      print("Finally! It took a lot of moments to end but now I can do something else.") 
    } 
} 
+0

这是行不通的。这里是我的func:'func initUserName(finished:@escaping() - > Void)let userRef = ref.child(“users”)。child((user?.uid)!)。child(“name”) userRef.observeSingleEvent(作者:.value的,有:{(快照) - >虚空中 让名:字符串= snapshot.value作为字符串 self.name =名称 完成() }){(错误)在 打印(error.localizedDescription) } }' –

+0

像这样来使用:'mainUser()initUserName(){ 打印( “数据检索”) }' –

+0

我是否正确地使用它? –