我正在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方法之后运行。实际上,定义表视图的方法也在快照之前运行,导致调用不显示任何数据。
答案 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数据的代码块是异步运行的。