2016-05-27 10 views
0

firebaseデータベースの異なるパスからコンテンツをキャプチャし、それらをチャートに入れるために配列に保存する必要があります。Swift - Firebase複数のスナップショット

snapshot.Valueを入手して、それをコードの後の時点でアクセスできる変数に保存する方法はありますか?

これは私がやろうとしているかを示したコードです:

override func viewDidLoad() { 
    super.viewDidLoad() 

    leave.observeEventType(.Value, withBlock: { snapshot in 
     let vaiable = snapshot.value 
    }) 

    remain.observeEventType(.Value, withBlock: { snapshot in 
     let variableTwo = snapshot.value 
    }) 

    undecided.observeEventType(.Value, withBlock: { snapshot in 
     let vaiableThree = snapshot.value 
    }) 

    let options = ["Remain", "Leave", "Undecided"] 
    let results = [variable, variableTwo, variableThree] 
    setChart(options, values: results) 

しかし、私はfirebase呼び出しがすべての最後に行われていることを信じて、変数が「結果」列に空であることを意味。

何か不足していますか?

+0

火災基地通話は非同期呼び出しなので、すべての呼び出しを連鎖する必要があります。並列を望む場合は、すべての完了ブロックが終了するまで待ちます。 –

答えて

0

まず、「スコープ」に問題があります。関数またはコールバックの内部で宣言された変数は、その関数またはコールバックの外部から決してアクセスできません。

あなたの問題を解決する1つの方法は、このようなことができ

var results: [FIRDataSnapshot] = [] 
override func viewDidLoad() { 
    super.viewDidLoad() 

    leave.observeEventType(.Value, withBlock: { snapshot in 
    self.results.append(snapshot.value) 
}) 

remain.observeEventType(.Value, withBlock: { snapshot in 
    self.results.append(snapshot.value) 
}) 

undecided.observeEventType(.Value, withBlock: { snapshot in 
    self.results.append(snapshot.value) 
}) 

しかし、今あなたが本当にあなたのresults配列は、実際にデータが移入され天気をかを知る方法を持っていない、またはコールバックの場合まだ完了しています。

もっと厄介な方法は、あなたのコールバックを別の関数にリファクタリングすることです。最初のコールバックが完了すると、2番目のコールバックの関数が呼び出されます。 3番目のコールバックを使用して、データで何かを行うことができます。望むところは

+1

答えをありがとう。私はそれを私の意図と目的のために働く別の方法で修正することができましたが、これがより正確な答えであると信じています。 – dwinnbrown

関連する問題