在我的模型中,我有一个从firebase读取数据的功能。 我完成后调用completionHandler(true)。 这是我的控制器中的viewDidLoad函数,它扩展了UITableViewController。
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中删除并返回列表则填充。< / p>
我无法确切地知道我哪里出错了。
感谢。
更新
我仍然无法让它工作,所以我使用了委托而不是completionHandler。我做的是:
的Singleton:
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()
}
这一切都有效。我不知道答案的唯一问题是DispatchQueue.main.async是每次firebase读取&#34; user&#34;时调用的。但我把它放在readInFirebase函数的末尾,列表中没有填充任何内容。但无论如何它现在都有效。
答案 0 :(得分:5)
可能ResourceDictionary
方法是异步的,回调运行在与主要线程不同的线程上。
请记住,所有与UIKit相关的调用必须才能在主线程上运行。
尝试:
readInFirebaseData
答案 1 :(得分:1)
请务必设置delegate和dataSource:
tableView.delegate = self
tableView.dataSource = self
并确保从主线程中调用reloadData()
:
DispatchQueue.main.async {
self.tableView.reloadData()
}
从后台线程调用它通常不会导致重新加载表,因为此操作与UI相关。任何UI相关操作都应该从主线程执行。