2017-03-03 82 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

我是否正確地使用它? –