2017-04-09 13 views
0

我有一個問題,在我看來這不應該是一個問題。Swift沒有在回報聲明中設置一個值

當我加載這個'簡單'功能時,它應該返回數據庫中的用戶。

- returns usersDictionary: All the users in a dictionary 
*/ 
func getAllUsers() -> Dictionary<String, AnyObject> { 
    var usersDict = Dictionary<String, AnyObject>() 

    if userIsLoggedIn() == true{ 
     FIRDatabase.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in 
      if let userDictionary = snapshot.value as? [String:AnyObject]{ 
       for user in userDictionary{ 

        usersDict.updateValue(user.value as AnyObject 
         , forKey: user.key as String) 


       } 
       print("TEST") 
       print(usersDict) 
      } 
      print("TEST2") 
      print(usersDict) 
     }) 
     print("TEST3") 
     print(usersDict) 
     return usersDict 

    } 
    return usersDict 
} 

但是它不返回值usersDict,只是空的,因爲它打印輸出測試和TEST2 usersDict的值是奇怪。

但是Test3仍然是空的,這怎麼可能?如果我查看控制檯,它首先測試Test3,然後測試然後測試test2。

這是控制檯打印:

TEST3 
[:] 
TEST 
"ZuUiTSu142P5NTc9VfekRbuFcny2": { 
    address = "testAddress"; 
    email = "[email protected]"; 
    name = "testuser"; 
    phonenumber = "1234567890"; 
    rol = Customer; 
}] 
TEST2 
"ZuUiTSu142P5NTc9VfekRbuFcny2": { 
    address = " testAddress "; 
    email = " [email protected] "; 
    name = "testuser"; 
    phonenumber = "1234567890"; 
    rol = Customer; 
}] 
+0

這並不奇怪,在所有:'observeSingleEvent'工作** **異步的

func loadBusiness(busUID: String,with completion: @escaping(_ business: [String:AnyObject], _ error: NSError?) -> Void){ FIRDatabase.database().reference().child("businesses").child(busUID).observeSingleEvent(of: .value, with: { (snapshot) in if let busDict = snapshot.value as? [String:AnyObject]{ completion(busDict, nil) } }) { (error) in print("Error occured: " + error.localizedDescription) } } 

只是我如何能做到這一點,我隨處現在把它叫做一個簡單的例子數據將在稍後的封閉中返回。你需要一個完成處理程序,直接返回是不可能的。 – vadian

+0

[在Swift函數中從異步調用中返回數據]的可能副本(http://stackoverflow.com/questions/25203556/returning-data-from-async-call-in-swift-function) – Keiwan

回答

0

@vadian是正確的,他的評論點:你正試圖在功能同步返回一個值,而要以異步方式獲取數據。一切發生在您的// lines of code這裏:

FIRDatabase.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in 
    // ... 
    // lines of code 
    // ... 
}) 

異步發生。含義:它發生在後臺,並且在調用observeSingleEvent之後的任何代碼都會首先執行,因此您會看到TEST3作爲輸出的第一行。

圍繞Asynchronous Model有幾種不同的設計方法。一旦異步代碼執行完畢,可能最簡單的方法就是傳遞一個回調函數。

聽起來很混亂?不要擔心,起初它會令人困惑,但一旦你得到它,你會爲這個概念的簡單性而感到驚訝。

我不打算解釋回調和異步是如何工作的,但我會指出你有一個很好的答案similar problem。給它一看,你應該明白了。

祝你好運!

0

謝謝大家的答案,也許有點太晚了,因爲我跳過這一段時間並專注於其他事情,但我今天看了它,並設法做到最後很容易。

// Load basic company info 
     db.loadBusiness(busUID: db.getMyUID()) { (business, error) in 
      self.myCompany = business 
     }