通知 table 视图重新加载数据
Notify table view to reload data
我有这个 table 视图控制器:
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?
})
...
数据加载正常,但 table 仍为空。再次调用 viewWillAppear(...)
后,数据位于 table.
我需要通知 table 视图吗?什么是最干净的方法/最佳实践?
谢谢!
要刷新调用 cellForRowAtIndexPath 的 tableView,您可以:
self.eventTableView.reloadData()
只需调用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()
}
我有这个 table 视图控制器:
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?
})
...
数据加载正常,但 table 仍为空。再次调用 viewWillAppear(...)
后,数据位于 table.
我需要通知 table 视图吗?什么是最干净的方法/最佳实践?
谢谢!
要刷新调用 cellForRowAtIndexPath 的 tableView,您可以:
self.eventTableView.reloadData()
只需调用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()
}