2016-07-02 81 views
4

我剛剛開始學習來自後端世界的IOS開發。我正在尋找傳遞一個用戶ID到這個函數並返回名字,所有來自Firebase的數據。我目前試圖將名稱值從關閉中分離出來並不起作用,空字符串被返回。我如何去構建這個代碼來獲取'name'變量來返回。如何從iOS/Swift中的閉包函數返回值?

func getNameOfUser(uid: String) -> String { 
    var name: String = "" 
    FIRAuth.auth()?.signInAnonymouslyWithCompletion() { (user, error) in 
     self.ref = FIRDatabase.database().reference() 
     self.ref!.child("users").child(uid).child("name").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      name = snapshot.value! as! String 
     }) { (error) in 
      print(error.localizedDescription) 
     } 
    } 
    return name 
} 

回答

2

這是行不通的。 signInAnonymouslyWithCompletion()正在後臺工作。

異步創建併成爲匿名用戶。

這意味着getNameOfUser()及其局部變量已經消失,當完成塊被執行時。

func getNameOfUser(uid: String) -> String 
{ 
    var name: String = "" 
    FIRAuth.auth()?.signInAnonymouslyWithCompletion() 
    { (user, error) in 
    // Executed somewhere in the future 
    } 
// Executed immeditaly. 
return name 
} 

,而不是返回結果的,你應該通過完成塊作爲參數傳遞給函數並執行完成塊內。