通知表视图以重新加载数据

时间:2015-01-10 22:53:59

标签: ios uitableview swift

我有这个表视图控制器:

class EventListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPickerViewDelegate, UIPickerViewDataSource {

    // Event table view
    @IBOutlet weak var eventTableView: UITableView!

    var events: [Event] = []
    ...

我想从Web服务异步加载数据,这可能需要5秒钟。

我有这个异步代码:

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    // ApiClient is a custom wrapper for my API
    ApiClient.sharedInstance.getEvents({
        (error: NSError?, events: [Event]) in

        // All this runs within an asynchronous thread

        if let error = error {
            println("Error fetching events")
            println(error.localizedDescription)
        }

        self.events = events
        // How to notify the table view?
    })
    ...

数据加载正常,但表保持空白。再次调用viewWillAppear(...)后,数据就会出现在表格中。

我是否需要通知表格视图?什么是最干净的方式/最佳实践?

谢谢!

2 个答案:

答案 0 :(得分:5)

只需致电self.eventTableView.reloadData()

如果你的闭包中的代码是在异步线程上执行的,你可能需要将该调用封装到dispatch_async调用中,以便在主线程上触发它(因为所有与UI相关的工作必须始终是在主线程中运行):

// All this runs within an asynchronous thread
...
self.events = events

// Notify the tableView to reload its data.
// We ensure to execute that on the main queue/thread
dispatch_async(dispatch_get_main_queue()) {
  self.eventTableView.reloadData()
}

答案 1 :(得分:2)

要刷新tableView调用cellForRowAtIndexPath,请执行以下操作:

self.eventTableView.reloadData()