我的完成处理程序完成后仍然无法重新载入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函数的末尾,并且没有任何内容填充到列表中。但无论如何,它目前都有效。

+0

你可以在设置你的tableview的地方显示代码吗? – Wez

+0

嘿@Wez。我扩展了一个UITableViewController,所以这个类被定义为类ListController:UITableViewController,UISearchResultsUpdating。 – Mike

+0

你的UITableViewDelegate和UITableViewDataSource在哪里? – Wez

可能readInFirebaseData方法是异步的,并且回调函数在与主函数不同的线程上运行。

请记住所有UIKit相关调用必须在主线程上运行

与尝试:

model.readInFirebaseData { (success) in 
    print("data read in") 
    dataArray = model.firebaseDataArray 

    DispatchQueue.main.async { 
     activityIndicatorView.stopAnimating() 
     self.tableView.reloadData() 
    } 
} 
+0

我更新了我的帖子。最后使用了一个委托。 – Mike

一定要设置委托和数据源:

tableView.delegate = self 
tableView.dataSource = self 

并确保您从主线程中调用reloadData()

DispatchQueue.main.async { 
    self.tableView.reloadData() 
} 

从后台调用它线程通常不会导致您的表重新加载,因为此操作与UI相关。应该从主线程执行任何与UI相关的操作。