在封闭

时间:2017-07-08 23:23:27

标签: arrays swift firebase firebase-realtime-database

我从我的firebase数据库中提取userUID数据并将其放入数组中。当我在观察闭合点之外打印数组时,它不会打印,但它会在封闭内部打印。这是怎么回事?

let databaseRef = Database.database().reference()
var userUIDArray = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    databaseRef.child("Users").observe(.value, with: { (snapshot) in
        let snapshots = snapshot.children.allObjects as! [DataSnapshot]
        for child in snapshots {
            self.userUIDArray.append(child.key)
        }
    })
    print(self.userUIDArray)
}

1 个答案:

答案 0 :(得分:1)

闭包内的代码是异步执行的(在发出网络请求之后),这意味着它在viewDidLoad内的其余代码之后执行。

以下是代码执行时的快速排序:

override func viewDidLoad() {

    // #1

    databaseRef.child("Users").observe(.value, with: { (snapshot) in
        // #3
    })

    // #2

}

闭包之外的print语句不会打印任何内容,因为调用时数组中没有元素。闭包内的print语句有效,因为数组在被调用之前已被修改。

以下是从Firebase返回时如何使用此数据的示例:

let databaseRef = Database.database().reference()
var userUIDArray = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    databaseRef.child("Users").observe(.value, with: { (snapshot) in
        let snapshots = snapshot.children.allObjects as! [DataSnapshot]
        for child in snapshots {
            self.userUIDArray.append(child.key)
        }
        updateUserInterface()
    })

}

func updateUserInterface() {
    // update the UI here using the `userUIDArray` variable
    myTableView.reloadData()
}