Arrays 在闭包中追加到数组

Arrays 在闭包中追加到数组,arrays,swift,firebase,firebase-realtime-database,Arrays,Swift,Firebase,Firebase Realtime Database,我从firebase数据库中提取userUID数据并将其放入数组中。当我在observe闭包外部打印数组时,它不会打印,但在闭包内部会打印。这里发生了什么事 let databaseRef = Database.database().reference() var userUIDArray = [String]() override func viewDidLoad() { super.viewDidLoad() databaseRef.child("Users").obse

我从firebase数据库中提取userUID数据并将其放入数组中。当我在observe闭包外部打印数组时,它不会打印,但在闭包内部会打印。这里发生了什么事

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)
}

闭包中的代码是异步执行的(在发出网络请求之后),这意味着它在
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()
}

闭包中的代码是异步执行的(在发出网络请求之后),这意味着它在
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()
}

闭包正在异步运行。您的最终打印是在闭包有机会将值附加到数组之前进行的。闭包正在异步运行。您的最终打印是在闭包有机会将值附加到您的数组之前进行的。如何将它们附加到我的数组中?您正在正确地将它们附加到数组中。如果要使用数据(例如更新UI),可以从闭包(标记为#3)内部调用函数,而不是在viewDidLoad(标记为#2)中调用函数。您介意向我展示一下这是什么样子吗。我试过了,但一定是做错了。是的,我还是弄不懂。我真的不知道该在函数中添加什么来更新tableview。您应该能够在table view上调用
reloadData
。我该如何将它们追加到数组中?您正确地将它们追加到了数组中。如果要使用数据(例如更新UI),可以从闭包(标记为#3)内部调用函数,而不是在viewDidLoad(标记为#2)中调用函数。您介意向我展示一下这是什么样子吗。我试过了,但一定是做错了。是的,我还是弄不懂。我真的不知道该在函数中添加什么来更新tableview。您应该能够在tableview上调用
reloadData