2015-01-10 7 views
2

У меня есть этот контроллер представления таблицы:Уведомлять табличное перезагружать данные

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

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

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

Я хотел бы, чтобы загрузить данные асинхронно из веб-службы, это может занять до 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(...) вызывается снова, данные находятся в таблице.

Нужно ли мне уведомлять о виде таблицы? Какой самый чистый способ/лучшая практика?

Спасибо!

ответ

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() 
} 
+0

Я думаю, что вам нужно самостоятельно. перед этим, верно? –

+0

Это сработало, спасибо! – mitchkman

2

Чтобы обновить Tableview призывающую cellForRowAtIndexPath, вы делаете:

self.eventTableView.reloadData()