结构数组在闭包之外没有更新

Posted

技术标签:

【中文标题】结构数组在闭包之外没有更新【英文标题】:Array of struct not updating outside the closure 【发布时间】:2017-05-26 07:54:37 【问题描述】:

我有一个名为 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

任何帮助将不胜感激!

【问题讨论】:

【参考方案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

        )
    

【讨论】:

调用reload data方法后,解决了我的问题 太好了。继续质疑。 (提出答案接受,所以下次其他人可以直接解决问题。)@packability 如果你认为你解决了你的问题,只需点击我回答的向上箭头。 @packability【参考方案2】:

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

    

【讨论】:

感谢您的回答!但我收到一条错误消息,说模块“Dispatch”没有名为 main 的成员 @packability 是DispatchQueue.main.async @Sorry 拼写错误。更新了答案。

以上是关于结构数组在闭包之外没有更新的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 我如何在闭包之外返回数组值?

访问闭包之外的数据

我如何在闭包之外访问数组?

viewDidLoad 之外的闭包

如何从 Swift 的闭包中接收方法的输出?

JavaScript闭包初探