Swift 如何使用外部变量。观察

Swift 如何使用外部变量。观察,swift,dictionary,firebase,Swift,Dictionary,Firebase,我现在有下面的代码。这将成功地从firebase中提取信息,然后将其附加到字典数组中。我的问题是我如何使用这本字典以外的。观察?我理解firebase的异步与同步的问题,但我还没有找到一个关于如何在另一个函数中使用此数据的好解释 override func viewDidLoad() { FIRDatabase.database().reference().child("vendors").observe(.value, with: { (snapshot) in le

我现在有下面的代码。这将成功地从firebase中提取信息,然后将其附加到字典数组中。我的问题是我如何使用这本字典以外的。观察?我理解firebase的异步与同步的问题,但我还没有找到一个关于如何在另一个函数中使用此数据的好解释

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)

        }
    })

这成功地将我需要的信息转储到中。请注意,如果我将字典转储到外部,它会说它是空的。

您最好的选择是在闭包结束时调用所需的函数,但在“for”循环之外。这样,您将填充字典,并且仍然在同一线程上。
其他选项包括:添加一个完成块和创建一个协议(由于我自己对这两个选项不太熟悉,所以无法详细说明)

您知道为什么无法访问“spot”var吗?它被称为变量范围。它是在闭包中声明的,因此您将无法访问它。如果您使用不同的作用域定义它(比如在viewDidLoad()之外),您将能够访问它。(如果self在闭包中,您可能需要在前面添加self,但这没关系。)我正在尝试访问viewDidLoad()之外的字典数组。通过将spot信息附加到阵列中,我应该仍然能够访问阵列,不是吗?我想我知道问题所在。你能发布你对vendorDict的定义吗?var vendorDict=[[String:String]]()这就是我创建vendorDict的方式。这是在任何函数中使用的整个类中创建的。