2017-06-23 9 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を追加しましたhave 1

が追加されました。2

など

これは期待した出力ではない可能性があります。しかしそれは意図したとおりに働いています。 Firebaseはデータベースから非同期にデータをロードします。コードをブロックするのではなく、スレッドを続行して(ユーザーがアプリを使い続けることができるように)、新しいデータが利用可能になったときにobserveに渡したコードブロックにコールバックします。

これは、このコードが配列を返すまでにまだ空ですが、後で項目が追加されることを意味します。これは、あなたが試行している方法で関数からデータを返すことができないことを意味します。

私は、自分の考え方を変えるのが最も簡単だと思います。 「最初にデータを取得してから印刷する」の代わりに、「データの取得を開始します。

上記のコードでは、コールバックブロックに出力するコードを移動することでこれを行いました。これを行う代わりに、完了ハンドラまたはクロージャと呼ばれる独自のコールバックをSwiftで作成することもできます。例はthis articlethis article、この質問Callback function syntax in Swift、またはもちろんAppleのマニュアルにあります。

+0

これは私にはもっと意味があり、なぜこれが役立つのかが分かります。私の問題は、CoreDataを使用するように以前のコードを設定していた場合です。この場合、古いデータを呼び出して、この関数を使って配列にダンプします。さて、私はこれのためにfirebaseを使用したいと思います。私はこれを使って自動的に更新するテーブルビューを作成する方法を知っていますが、値(距離値)を追加して合計距離を出力したいユースケースもあります。 idが知っている唯一の方法は、それを配列にダンプし、合計機能を実行することです。私はそれを非同期型の関数で簡単に行うことはできないようです。 –

+0

あなたはちょっと違うしかありません。 '.child *'イベントを待ち受けるときは、実行中の集約を保つことができます。これまでの値の合計だけです。また、 '.value'イベントのためにllistenすることもできます。これにより、すべての子ノードを一度に見ることができます。それらを繰り返して何かが変わるたびに合計を計算してください。 https://firebase.google.com/docs/database/ios/lists-of-data#listen_for_value_eventsをご覧ください。 –

関連する問題