将值更改为从firebase中提取的数据时,变量将恢复为初始值。我怎样才能保持价值?

时间:2017-10-02 01:00:16

标签: swift firebase firebase-realtime-database

我正在Xcode中创建一个swift程序,它从firebase数据库中提取事件列表,为每个事件创建一个表视图单元格,并将所述单元格放在表格视图中。问题在于,当我将存储事件的数组的值设置为从firebase提取的任何内容时,该值会在关闭快照后立即恢复。以下是相关代码:

struct cellData {
  let Title: String
  let Date: String
  let Time: String
  let Desc: String
  var Image: UIImage?
}

classTableViewController: UITableViewController {
    var ref:DatabaseReference?
    var arrayOfCellData = [cellData]()

   override func viewDidLoad() {

       ref = Database.database().reference()



       ref?.child("Events").observeSingleEvent(of: .value, with {(snapshot) in

           let data = snapshot.value as! NSArray

            var i = 0
            while(i < data.count) {
                 let event = data[i] as! NSArray


                 if(event[0] as! String == "TRUE") {
                      self.arrayOfCellData.append(cellData(
                         Title:event[1] as! String,
                         Date:event[2] as! String,
                         Time:event[3] as! String,
                         Desc:event[4] as! String,
                         Image: nil))


                        print(self.arrayOfCellData[i])


                 }



              i += 1
            }


       })

                       print(arrayOfCellData.count)

   }

 }

基于此代码,它应该单独打印每个事件(数据库中有两个事件),然后它应该打印数组中的事件总数。但是,这是在控制台中打印的内容:

0
cellData(Title: "Event #1", Date: "9/18/17", Time: "6:30 PM", Desc: "Generic Event Description", Image: nil)
cellData(Title: "Event #2", Date: "5/15/26", Time: "12:15 PM", Desc: "Please attend this event", Image: nil)

正如您所看到的,快照在视图didLoad方法之后运行。实际上,定义表视图的方法也在快照之前运行,导致调用不显示任何数据。

2 个答案:

答案 0 :(得分:1)

可能会有所帮助:

我认为因为observeSingleEvent是异步调用,所以你需要使用完成处理程序来提供数据:

编写一个名为fetchData的函数,然后在viewDidLoad方法中使用它:(正如我在使用中所提到的)

func fetchData(completionHandler: @escaping ([cellData]) -> Void) {
           ref = Database.database().reference()



           ref?.child("Events").observeSingleEvent(of: .value, with {(snapshot) in

               let data = snapshot.value as! NSArray

                var i = 0
                while(i < data.count) {
                     let event = data[i] as! NSArray


                     if(event[0] as! String == "TRUE") {
                          self.arrayOfCellData.append(cellData(
                             Title:event[1] as! String,
                             Date:event[2] as! String,
                             Time:event[3] as! String,
                             Desc:event[4] as! String,
                             Image: nil))


                            print(self.arrayOfCellData[i])


                     }



                  i += 1
                }


                    completionHandler(self.arrayOfCellData)
               })


        }

用法:

self.fetchData { fetchedArray in

            print(fetchedArray)
}

答案 1 :(得分:0)

要解决这个问题,我只需从块中重新加载表视图。我添加了一行

self.tableView.reloadData()

并且表视图将使用新数据重新加载。 0是在其他数据之前打印的,因为拉取firebase数据的代码块是异步运行的。