2016-07-10 8 views
0

私はFirebaseから結果を得てArrayに入れようとしていますが、何かが恋しくなるようです。私が望むのは、Firebaseから 'Time'と 'Blood Glucose'の値を取得し、それらをChartに使用する配列に入れることです。データを 'BG'と 'TIME'配列に入れることができます。私は「FetchedDate」にそれらを「APPEND」と「FetchedBG」ときには多少時間がかかる場合がありますので、私は。空の配列(FetchedBGとFetchedDate)FirebaseのデータをArrayに正しく追加する方法は?

var FetchedDate:[String]! = [] 
var FetchedBG: [Double]! = [] 

//GET DATA FROM FB 
func GetDetails(){ 
    let posts = rootRef.child("Diary/\(userID!)/\(passedDATE!)") 
    //let posts = rootRef.queryOrderedByChild(passedDATE!) 
    posts.observeEventType(FIRDataEventType.Value , withBlock: { (snapshot) in 

     for list in snapshot.children { 
      if let BG = list.value.objectForKey("Blood Glucose")!.doubleValue { 
      self.FetchedBG.append(BG) 
       print(BG) // SHOWS RESULTS AS EXPECTED 
      } 
      if let TIME = list.value.objectForKey("Time") { 
      self.FetchedDate.append(TIME as! String) 
        print(TIME) // SHOWS RESULTS AS EXPECTED 
      } 
     } 
    }) { (error) in 
     print(error.localizedDescription) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    GetDetails() 

    print(FetchedDate) // EMPTY ARRAY 
    print(FetchedBG) // EMPTY ARRAY 

答えて

2

Firebase負荷(と同期する)非同期データベースからのデータを参照してください、

値が使用可能になると(最初またはデータが変更されたとき)、ブロックが呼び出され、ブロックが呼び出されます。しかし、その時までにあなたの印刷ステートメントは長く終わった。

解決策は、値が利用可能なとき(または変更されたとき)に実行する必要があるコードをに移動してブロックをに移動することです。例えば。

var FetchedDate:[String]! = [] 
var FetchedBG: [Double]! = [] 

//GET DATA FROM FB 
func StartSynchronizingDetails(){ 
    let posts = rootRef.child("Diary/\(userID!)/\(passedDATE!)") 
    //let posts = rootRef.queryOrderedByChild(passedDATE!) 
    posts.observeEventType(FIRDataEventType.Value , withBlock: { (snapshot) in 

     for list in snapshot.children { 
      if let BG = list.value.objectForKey("Blood Glucose")!.doubleValue { 
      self.FetchedBG.append(BG) 
       print(BG) // SHOWS RESULTS AS EXPECTED 
      } 
      if let TIME = list.value.objectForKey("Time") { 
      self.FetchedDate.append(TIME as! String) 
        print(TIME) // SHOWS RESULTS AS EXPECTED 
      } 
     } 
     print(FetchedDate) 
     print(FetchedBG) 
    }) { (error) in 
     print(error.localizedDescription) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    StartSynchronizingDetails() 

これは、あなたのアプリが(潜在的に時間のかかる)ネットワークリソースと対話するとき非常に一般的なパターンです。 FirebaseのobserveEventTypewithBlock:引数を取るのは、値の更新に応答するコードから同期を開始するコードを分離する理由です。

+0

ありがとうございます!今私はグラフにデータを置くことができます:) – Deyan

関連する問題