2017-03-18 6 views
0

現在以下のコードがあります。これにより、firebaseからの情報が正常に取得され、辞書の配列に追加されます。私の質問は、この辞書を.observeの外でどのように使うのですか?私はfirebaseとの非同期対同期の問題を理解していますが、このデータを別の機能でどのように使用できるかについての良い説明は見つかりませんでした。.observeの外で変数を使用する方法

override func viewDidLoad() { 
    FIRDatabase.database().reference().child("vendors").observe(.value, with: { (snapshot) in 

     let spot = snapshot.value as! [String : AnyObject] 
     for each in spot{ 
      let name2 = each.value["name"] as! String 
      let booth2 = each.value["boothNum"] as! String 
      let desc2 = each.value["description"] as! String 

      self.name = name2 
      self.booth = booth2 
      self.desc = desc2 

      let dict1: [String: String] = ["name" : name2, "booth" : booth2, "desc" : desc2] 

      self.vendorDict.append(dict1) 

      dump(self.vendorDict) 

     } 
    }) 

これは正常に.observeに必要な情報をダンプしますが、辞書を外にダンプすると空であると表示されます。

+0

「あなたの "スポット" varにアクセスできない理由が分かっていますか? *可変スコープ*と呼ばれています。クロージャー内で宣言されているため、アクセスできません。あなたが* viewDidLoad()*の外で別のスコープでそれを定義すれば、それにアクセスすることができます。 (閉じ込め内にある場合は* self *を追加する必要がありますが、それは問題ありません) – dfd

+0

私のviewDidLoad()の外にある辞書の配列にアクセスしようとしています。スポット情報を配列に追加することで、配列にアクセスできるはずですか? – ttorbik

+0

私はその問題を知っていると思います。 * vendorDict *の定義を投稿できますか? – dfd

答えて

0

あなたの最善のオプションは、 'for'ループの外側ではなく、終了時に必要な関数を呼び出すことです。このようにして、辞書が作成され、同じスレッドに置かれます。 その他のオプションは、補完ブロックの追加とプロトコルの作成です(自分では快適ではないので、これらの2つについてさらに詳しく説明することはできません)。

関連する問題