UITableViewController выполняет функции delate до завершения сетевого запроса

У меня возникли проблемы при попытке заполнить UITableView с результатами сетевого запроса. Кажется, что мой код в порядке, поскольку он работает отлично, когда моя сеть работает быстро, однако, когда это не так, функция - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath- все еще выполняется, что приводит к ошибке доступа. Я предполагаю, что это потому, что массив, который пытается использовать вышеупомянутая функция, еще не заполнен. Это подводит меня к моему вопросу: есть ли в любом случае, что я могу иметь UITableView методы делегата отложены, чтобы избежать этого?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"AlbumsCell";
//UITableViewCell *basicCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

AlbumsCell *cell = (AlbumsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (!cell) {
    **// Here is where the Thread 1: EXC_BAD_ACCESS (code=2 address=0x8)**
    cell = [[[AlbumsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

    Album *album = [_albums objectAtIndex:[indexPath row]];
    [cell setAlbum:album];

return cell;
}

1 ответ

Решение

Измените ваши методы делегата, чтобы обрабатывать сетевой запрос для статуса "в процессе". И как только вы получите ответ, позвоните reloadData на просмотр таблицы, который перезагрузит таблицу с правильными данными.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"AlbumsCell";
//UITableViewCell *basicCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    AlbumsCell *cell = (AlbumsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        **// Here is where the Thread 1: EXC_BAD_ACCESS (code=2 address=0x8)**
        cell = [[[AlbumsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if ((_albums) && ([_albums count] > [indexPath row])) {
        Album *album = [_albums objectAtIndex:[indexPath row]];
        [cell setAlbum:album];
    } else {
    //show some loading message in the cell
    }

    return cell;
    }
Другие вопросы по тегам