我试图不止一次地重新加载tableview。如下代码所示,最初,在0.5秒后,“重新加载”表视图,并且从Firebase加载了该表视图的所有元素。但是,在5.0秒后,调用runTimer()时,不会重新加载tableview。本质上,每次尝试在Firebase中进行更新时,我都试图“重新加载”数据,但似乎无济于事。由于我从头到尾都没遇到任何运气,因此对解决此问题的任何帮助表示赞赏。
override func viewDidLoad() {
super.viewDidLoad()
checkFireBase()
tableViewResults.delegate = self
tableViewResults.dataSource = self
let nibName = UINib(nibName: "TableViewCell", bundle: nil)
tableViewResults.register(nibName, forCellReuseIdentifier: "tableCell")
txtsearchBar.addTarget(self, action: #selector(searchRecords(_ :)), for: .editingChanged)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.tableViewResults.reloadData()
}
runTimer()
}
func runTimer(){
self.timer = Timer(fire: Date(), interval: 5.0, repeats: true, block: { (Timer) in
self.vehicleArray.removeAll()
DispatchQueue.main.async {
self.checkFireBase()
}
})
RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
self.tableViewResults.reloadData()
}
答案 0 :(得分:3)
您可以使用firebase提供的侦听器,而不是在此处使用计时器,当在Firebase实时数据库中更新数据时会自动调用这些侦听器。看到此链接:
答案 1 :(得分:0)
您已阐明您的checkFirebase()
方法正在更新数据。但是self.tableViewResults.reloadData()
只会被调用一次(调用runTimer()
时),计时器的代码块不会调用它。
可以将self.tableViewResults.reloadData()
放在您的checkFirebase()
方法中,也可以放在计时器的代码块中。每次触发计时器时,都会重新加载tableView。
答案 2 :(得分:0)
计时器将执行完成处理程序或完成块中的代码。
因此您的表更新调用
self.tableViewResults.reloadData()
runTimer()
函数中的调用仅在您调用时执行 功能。 要更新表格,您需要在以下情况下重新加载表格 您将更新数据源。
尝试以下
func runTimer(){
self.timer = Timer(fire: Date(), interval: 5.0, repeats: true, block: { (Timer) in
self.vehicleArray.removeAll()
DispatchQueue.main.async {
self.checkFireBase()
}
})
RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
self.tableViewResults.reloadData()
}
func checkFireBase(){
//Fetch the latest data and update the data Source of your Table view
self.tableViewResults.reloadData()
}