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

Mik*_*ike 1 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

    }
Run Code Online (Sandbox Code Playgroud)

但是表格仍然是空的,无论出于何种原因,self.tableView.reloadData()都没有像我想的那样填充表格,但如果我从TableViewController中删除并返回列表则填充.

我无法确切地看到我出错的地方.

谢谢.

更新:


我仍然无法让它工作,所以我使用了一个代表,而不是一个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")

        }

    })    

}
Run Code Online (Sandbox Code Playgroud)

TableViewController:

class ListController: TableViewController, Refresh{

 viewDidLoad()
{
   model.delegate = self
}

 func refreshData() {
        print("called")
       array = model.array
       self.tableView.reloadData()
    }
Run Code Online (Sandbox Code Playgroud)

这一切都有效.我不知道答案的唯一问题是DispatchQueue.main.async是每次firebase读取"user"时调用的.但我把它放在readInFirebase函数的末尾,列表中没有填充任何内容.但无论如何它现在都有效.

Ale*_*rrù 5

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

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

试试:

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

    DispatchQueue.main.async {
        activityIndicatorView.stopAnimating()
        self.tableView.reloadData()
    }
}
Run Code Online (Sandbox Code Playgroud)