我从我的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)
}
答案 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()
}