2016-07-10 3 views
0

Firebase에서 결과를 가져와 Array에 넣으려고하는데 뭔가 놓친 것 같습니다. 내가 원했던 것은 Firebase의 'Time'과 'Blood Glucose'값을 가져 와서 차트에 사용할 배열에 넣는 것입니다. 데이터를 'BG'와 'TIME'배열에 넣을 수는 있지만 나는 'FetchedDate'와 'FetchedBG'로 그들을 '추가'때 시간이 좀 걸릴 수 있기 때문에 내가. 비동기 데이터베이스에서 빈 배열 (FetchedBG 및 FetchedDate)Firebase의 데이터를 어레이에 올바르게 추가하는 방법은 무엇입니까?

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

중포 기지로드 (및 동기화) 데이터를 참조 코드가 계속 실행되고 배열이 아직 비어있는 상태에서 배열을 인쇄합니다.

값을 사용할 수있게되면 (처음 또는 데이터가 변경된 경우) 블록이 호출되고 블록이 호출됩니다. 그러나 그때까지 인쇄 진술은 오래 마쳤습니다.

해결 방법은 값을 사용할 수있을 때 (또는 변경되었을 때) 실행해야하는 코드를 블록으로 옮기는 것입니다. 예 : 앱이 (잠재적으로 시간이 많이 소요) 네트워크 리소스와 상호 작용할 때

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의 observeEventType 인수가 withBlock: 인수를 취하는 이유이기도합니다. 값 업데이트에 응답하는 코드에서 동기화를 시작하는 코드를 분리하기 때문입니다.

+0

대단히 감사합니다. 이제 차트에 데이터를 넣을 수 있습니다 :) – Deyan

관련 문제