2017-03-18 62 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

您是否知道*爲什麼*您無法訪問您的「spot」var?它被稱爲*變量範圍*。它在閉包中聲明,所以你將無法訪問它。如果你用一個不同的範圍來定義它 - 比如* viewDidLoad()*之外 - 你可以訪問它。 (你可能需要在封閉內部添加* self *,但這沒關係。) – dfd

+0

Im試圖訪問我的viewDidLoad()之外的字典數組。通過將數據追加到數組中,我仍然可以訪問數組,不是嗎? – ttorbik

+0

我想我知道這個問題。你可以發佈* vendorDict *的定義嗎? – dfd

回答

0

你最好的選擇是在閉包結束時調用需要的函數,但在'for'循環之外。這樣你將會填充字典,並仍然在同一個線程中。 其他選項是 - 添加一個完成塊並創建一個協議(無法詳細說明這兩者,因爲我自己不太習慣)。

相關問題