2017-06-23 73 views
0

好吧我從數據庫中讀取數據,並在打印出各個變量時正確輸出。但是,好像數據拒絕追加到數組。有人知道爲什麼我根本弄不清楚。從Firebase數據庫中讀取數據的問題

let commuteBuilder = Commutes() 

    Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in 


     //print(snapshot) 

     if let dict = snapshot.value as? NSDictionary { 
      commuteBuilder.distance = dict["Distance"] as! Double 
      commuteBuilder.title = dict["TripName"] as! String 
      commuteBuilder.transportType = (dict["Transport"] as? String)! 

     } 

     commuteArray.append(commuteBuilder) 
    }) 
    print("helper") 
    print(commuteArray.count) 
    return commuteArray 

回答

1

數據正確添加到陣列中,只是沒有在您打印數組的內容的時間。

如果改變這樣的代碼,你可以看到這一點:

let commuteBuilder = Commutes() 

Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in 

    if let dict = snapshot.value as? NSDictionary { 
     commuteBuilder.distance = dict["Distance"] as! Double 
     commuteBuilder.title = dict["TripName"] as! String 
     commuteBuilder.transportType = (dict["Transport"] as? String)! 

    } 

    commuteArray.append(commuteBuilder) 
    print("added one, now have \(commuteArray.count)") 
}) 
print("returning \(commuteArray.count)") 
return commuteArray 

你會看到它打印的是這樣的:

返回0

增加了一個,現在有1

加了一個,現在有2個

這可能不是您所期望的輸出。但它按預期工作。 Firebase異步加載數據庫中的數據。它不會阻塞您的代碼,而是讓線程繼續(因此用戶可以繼續使用該應用程序),而是在有新數據可用時調用回傳遞給observe的代碼塊。

這意味着當這段代碼返回數組時它仍然是空的,但它後來添加了項目。這意味着您不能以您嘗試的方式從函數返回數據。

我覺得最容易改變我對代碼的思考方式。而不是「首先獲取數據,然後打印」,我將其設置爲「開始獲取數據,當數據返回時,將其打印出來」。

在上面的代碼中,我通過將打印計數的代碼移動到回調塊的中。您也可以創建自己的回調,在Swift中稱爲完成處理程序關閉。您可以在this articlethis article,這個問題Callback function syntax in Swift或當然在Apple的文檔中找到示例。

+0

好吧,這對我來說更有意義,我明白爲什麼這可能會有用。我的問題是我以前設置我的代碼來使用CoreData,在這種情況下,我正在調用舊數據並將其轉儲到具有此功能的數組中。那麼現在我想爲此使用firebase。我得到了如何使用它來填充說自動更新的表視圖,但我也有用例,我想添加值(距離值)並輸出總距離。 id知道要做的唯一方法是將其轉儲到數組中並執行求和功能。似乎我不能輕鬆地使用它們的異步類型函數。 –

+0

你只需要做不同的事情。當你聽'.child *'事件時,你可以保持一個正在運行的聚合:只是迄今爲止的值的總和。或者,您可以查看'.value'事件,這會一次性爲您提供所有子節點。只需迭代它們,並在每次更改時計算總和。請參閱https://firebase.google.com/docs/database/ios/lists-of-data#listen_for_value_events –