结构数组不在闭包之外更新

时间:2017-05-26 07:54:37

标签: ios swift firebase firebase-realtime-database

我有一个名为displayStruct

的结构数组
struct displayStruct{
let price : String!
let Description : String!
} 

我正在从firebase读取数据并将其添加到我的结构数组myPost中,该结构在下面初始化

var myPost:[displayStruct] = [] 

我创建了一个函数,将数据库中的数据添加到我的结构数组中,如此

 func addDataToPostArray(){
    let databaseRef = Database.database().reference()
    databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with:  {
        snapshot in

        let snapshotValue = snapshot.value as? NSDictionary
        let price = snapshotValue?["price"] as! String
        let description = snapshotValue?["Description"] as! String
        // print(description)
        //  print(price)

        let postArr =  displayStruct(price: price, Description: description)
        self.myPost.append(postArr)
   //if i print self.myPost.count i get the correct length

    })
}
如果我打印myPost.count,在这个闭包内

我得到正确的长度但是在这个函数之外如果我打印长度我得零,即使你全局声明数组(我认为)

我在viewDidLoad方法

中调用了这个方法
   override func viewDidLoad() {
   // setup after loading the view.

    super.viewDidLoad()
   addDataToPostArray()
    print(myPeople.count) --> returns 0 for some reason


  }

我想在tableView

的功能下使用该长度是我的方法
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 return myPost.count --> returns 0
}

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

Firebase observe对数据库的调用是asynchronous,这意味着当您请求该值时,它可能无法获取,因为它可能正在获取它。

这就是为什么您count的两个查询都会在viewDidLoadDataSource delegeate方法中返回0。

  databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with:  { // inside closure }

在闭包内部,代码已经执行,因此您拥有值。

您需要做的是需要在闭包内的主线程中重新加载Datasource

   databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with:  { 
       // After adding to array
       DispatchQueue.main.asyc {
           self.tableView.reloadData()
       } 

    }

答案 1 :(得分:1)

您在关闭内部进行异步网络请求,并且编译器不会等待响应,因此在获取发布数据时只需重新加载表。用下面的代码替换它可以正常工作。一切顺利。

 func addDataToPostArray(){
        let databaseRef = Database.database().reference()
        databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with:  {
            snapshot in

            let snapshotValue = snapshot.value as? NSDictionary
            let price = snapshotValue?["price"] as! String
            let description = snapshotValue?["Description"] as! String
            // print(description)
            //  print(price)

            let postArr =  displayStruct(price: price, Description: description)
            self.myPost.append(postArr)
            print(self.myPost.count)
            print(self.myPost)
            self.tableView.reloadData()
       //if i print self.myPost.count i get the correct length

        })
    }