我的完成处理程序完成后仍然无法重新载入tableView数据swift 4
在我的模型中,我有一个函数可以读取firebase中的数据。 完成后,我会调用completionHandler(true)。 这是我的控制器中的viewDidLoad函数,它扩展了UITableViewController。我的完成处理程序完成后仍然无法重新载入tableView数据swift 4
override func viewDidLoad()
{
super.viewDidLoad()
let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.whiteLarge)
tableView.backgroundView = activityIndicatorView
self.activityIndicatorView = activityIndicatorView
activityIndicatorView.startAnimating()
model.readInFirebaseData { (success) in
print("data read in")
activityIndicatorView.stopAnimating()
dataArray = model.firebaseDataArray
self.tableView.reloadData()
}
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
tableView.tableHeaderView = searchController.searchBar
}
但表保持空,无论出于何种原因self.tableView.reloadData()不填充表,因为我想,但如果我从TableViewController Segue公司,回来的列表中填充。
我看不清楚我哪里出错了。
谢谢。
更新:
我仍然无法得到它的工作一个completionHandler我用委托的如此吧。我所做的是:
辛格尔顿:
protocol Refresh{
func refreshData()
}
var delegate:Refresh?
func readInFirebaseData()
{
self.ref.child("users").observe(DataEventType.childAdded, with: { (snapshot) in
user.name = value?["name"] as? String ?? ""
self.dict.updateValue(user, forKey: uid)
DispatchQueue.main.async {
self.delegate?.refreshData()
print("main thread dispatch")
}
})
}
的TableViewController:
class ListController: TableViewController, Refresh{
viewDidLoad()
{
model.delegate = self
}
func refreshData() {
print("called")
array = model.array
self.tableView.reloadData()
}
这所有的作品。我唯一不知道答案的问题是每次firebase读取“用户”时都会调用DispatchQueue.main.async。但是我把它放在readInFirebase函数的末尾,并且没有任何内容填充到列表中。但无论如何,它目前都有效。
可能readInFirebaseData
方法是异步的,并且回调函数在与主函数不同的线程上运行。
请记住所有UIKit相关调用必须在主线程上运行。
与尝试:
model.readInFirebaseData { (success) in
print("data read in")
dataArray = model.firebaseDataArray
DispatchQueue.main.async {
activityIndicatorView.stopAnimating()
self.tableView.reloadData()
}
}
我更新了我的帖子。最后使用了一个委托。 – Mike
一定要设置委托和数据源:
tableView.delegate = self
tableView.dataSource = self
并确保您从主线程中调用reloadData()
:
DispatchQueue.main.async {
self.tableView.reloadData()
}
从后台调用它线程通常不会导致您的表重新加载,因为此操作与UI相关。应该从主线程执行任何与UI相关的操作。
你可以在设置你的tableview的地方显示代码吗? – Wez
嘿@Wez。我扩展了一个UITableViewController,所以这个类被定义为类ListController:UITableViewController,UISearchResultsUpdating。 – Mike
你的UITableViewDelegate和UITableViewDataSource在哪里? – Wez