2016-07-14 18 views
4

Firebaseからデータを取得し、そのデータを取得するクロージャの外にそのデータを格納しようとしています。ファイアベースからデータを取得するクロージャからデータを取得する

var stringNames = [String]() 
    ref?.observeEventType(.Value, withBlock: { snapshot in 
     var newNames: [String] = [] 
     for item in snapshot.children { 
      if let item = item as? FIRDataSnapshot { 
       let postDict = item.value as! [String: String] 
       newNames.append(postDict["name"]!) 
      } 
     } 
     stringNames = newNames 
    }) 
    print(stringNames) 

stringNamesが空に戻ってきますが、閉鎖の内側から印刷すると正しいデータがあります。どんな助けでも大歓迎です、ありがとう!

答えて

6

Firebaseからデータをフェッチすると、呼び出しは非同期であるためです。あなたができること:

オプション1 - ロジックをクロージャ内に設定します(これは、クロージャ内でvarを印刷するものと同じです)。

オプション2 - のようなあなたのデータを受信しようとして独自の閉鎖を定義します。

func myMethod(success:([String])->Void){ 

    ref?.observeEventType(.Value, withBlock: { snapshot in 
     var newNames: [String] = [] 
     for item in snapshot.children { 
      if let item = item as? FIRDataSnapshot { 
       let postDict = item.value as! [String: String] 
       newNames.append(postDict["name"]!) 
      } 
     } 
     success(newNames) 
    }) 
} 

オプション3 -

protocol MyDelegate{ 
    func didFetchData(data:[String]) 
} 

class MyController : UIViewController, MyDelegate{ 

    func myMethod(success:([String])->Void){ 
     ref?.observeEventType(.Value, withBlock: { snapshot in 
      var newNames: [String] = [] 
      for item in snapshot.children { 
       if let item = item as? FIRDataSnapshot { 
        let postDict = item.value as! [String: String] 
        newNames.append(postDict["name"]!) 
       } 
      } 
      self.didFetchData(newNames) 
     }) 
    } 

    func didFetchData(data:[String]){ 
     //Do what you want 
    } 

} 
+0

デリゲートパターンを使用してデリゲートパターンは、私がしたかった何のためにきれいに本当に働いていましたデータを使って、ありがとう! –

関連する問題