2015-02-19 3 views
-2

У меня есть функция, которая отправляется в Интернет и загружает данные, которые затем помещаются в TableViewCell.Call CellForRow после завершения блока

Моя проблема заключается в том, что метод делегирования CellForRow вызывается до того, как приложение вернет данные из Интернета.

Как я могу вызвать метод делегата CellForRow после того, как у меня есть данные из Интернета?

+0

Упрощенная таблица reloadData метод для обновления таблицы – Shashi3456643

+0

После извлечения данных вам необходимо перезагрузить данные таблицы в блоке async. Я рекомендую опубликовать ваш код, если у вас все еще есть проблемы. –

+0

вы либо сделаете запрос раньше, либо вы вызываете 'reloadTableView' в блоке завершения для запроса –

ответ

1

Имеет ли ваша функция надлежащий блок завершения? Похоже, что происходит то, что вы вызываете cellForRow синхронно, тогда как процесс, отправляемый для скачивания, асинхронен. Я подозреваю, что ваш код выглядит примерно так:

// ... 
[self downloadMethod]; 
[self cellDelegateCall]; 
// ... 

система не знает, как долго downloadMethod собирается принять, так это будет просто выполнить cellDelegateCall сразу. Вам понадобится надлежащий блок завершения:

// ... 
[self downloadMethodWithCompletion:^(BOOL successful) { 
    if (successful) { 
     [self cellDelegateCall]; 
    } 
}]; 
// ... 

Знакомство с написанием собственных блоков может сбить с толку вначале. This website - отличный ресурс. Даже после нескольких лет написания блоков, я все же время от времени проверяю его. Надеюсь это поможет!

0

Одна вещь, чтобы привыкнуть примерно к cellForRow - это то, что вы чаще всего не называете ее напрямую. Просто знайте, что это срабатывает в разное время, например, когда таблица сначала отображается в контроллере представления и когда для таблицы требуется новая ячейка. И, как говорили другие, если вам нужно вызвать cellForRow, позвоните tableView.reloadData().

1

Не нужно явно вызывать делегат cellForRow, вы просто перезагружаете представление таблицы после получения своих данных, он называет делегат cellForRow.

Swift 2,3:

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    self.tableView.reloadData() 
    }) 

Swift 3:

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

После загрузки данных из Интернета, вам нужно позвонить reloadRowsAtIndexPaths на Tableview.