我的完成处理程序完成后仍然无法重新加载tableView数据swift 4

时间:2017-10-18 10:47:28

标签: swift

在我的模型中,我有一个从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函数的末尾,列表中没有填充任何内容。但无论如何它现在都有效。

2 个答案:

答案 0 :(得分:5)

可能ResourceDictionary方法是异步的,回调运行在与主要线程不同的线程上。

请记住,所有与UIKit相关的调用必须才能在主线程上运行。

尝试:

readInFirebaseData

答案 1 :(得分:1)

请务必设置delegate和dataSource:

tableView.delegate = self
tableView.dataSource = self

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

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

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