来自Firebase的数据未加载到阵列中

时间:2017-01-12 20:11:19

标签: ios swift firebase firebase-realtime-database

我没有故事板。我以编程方式完成所有操作。

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

2 个答案:

答案 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))!

一旦获得了查询数据,就可以处理观察者并在推送新数据时根据需要附加数据。

除此之外,弗兰克的答案是,即使您将听众设置为正确,您在添加公司时也永远不会看到打印的原因 - 您需要在完成块内写下观察者或查询。