我没有故事板。我以编程方式完成所有操作。
loadData()
方法获取Firebase数据,将其放入Company
对象,然后将对象加载到companies
数组中。在App Delegate的didFinishLaunchingWithOptions
方法中,我实例化了该类并调用了loadData()
当我在评论指示的行处运行断点并输入" po公司"在控制台中,我得到0家公司。 .observe
中的打印语句打印到控制台,我可以看到公司的属性是非空的,但是.observe
以外的任何内容,包括for循环和后面调用的print语句不会打印App Delegate中的加载数据方法。
class informationStateController {
func loadData() {
//Set firebase database reference
ref = FIRDatabase.database().reference()
//Retrieve posts and listen for changes
databaseHandle = ref?.child("companies").observe(.childAdded, with: { (snapshot) in
//Code that executes when child is added
let company = Company()
company.name = snapshot.childSnapshot(forPath: "name").value as! String
print(company.name)
company.location = snapshot.childSnapshot(forPath: "location").value as! String
print(company.location)
self.companies.append(company)
print("databaseHandle was called")
})
for company in companies {
print(company)
}
//breakpoint inserted here
}
}
为什么我的数组为空?为什么打印语句在.observe
以外打印到控制台?控制台的输出设置为"所有输出"。我在课程中调用了import FirebaseDatabase
,在App Delegate中调用了import Firebase
。
答案 0 :(得分:2)
以异步方式从Firebase数据库加载数据。这意味着,当您打印公司时,它们将无法加载。
您可以通过在公司加载时打印公司来轻松看到这一点:
//Set firebase database reference
ref = FIRDatabase.database().reference()
//Retrieve posts and listen for changes
databaseHandle = ref?.child("companies").observe(.childAdded, with: { (snapshot) in
//Code that executes when child is added
let company = Company()
company.name = snapshot.childSnapshot(forPath: "name").value as! String
print(company.name)
company.location = snapshot.childSnapshot(forPath: "location").value as! String
print(company.location)
self.companies.append(company)
print("databaseHandle was called")
for company in companies {
print(company)
}
})
现在你首先会看到一家公司打印出来(第一次childAdded
点火时),然后是两家公司(当childAdded
再次点火时),然后是三家公司等等。
答案 1 :(得分:0)
根据文档(强调我的)
重要提示:每次在指定的数据库引用处更改数据时,FIRDataEventTypeValue事件都会被触发,包括对子项的更改。要限制快照的大小,请仅在观察更改所需的最高级别附加。例如,不建议将侦听器附加到数据库的根目录。
在您的情况下,您观察对数据库的更改,但不会发生任何更改,因此您不会下注获取新数据。我认为文档会让这个问题变得不必要,如果您想要提取已经存在的记录,您必须查询它:
https://firebase.google.com/docs/database/ios/lists-of-data#sort_data
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("companies").queryLimited(toFirst: 100))!
一旦获得了查询数据,就可以处理观察者并在推送新数据时根据需要附加数据。
除此之外,弗兰克的答案是,即使您将听众设置为正确,您在添加公司时也永远不会看到打印的原因 - 您需要在完成块内写下观察者或查询。