Почему мой UITableView теряет свою плавность, когда я прокручиваю во время асинхронной перезагрузки данных? - PullRequest
0 голосов
/ 01 июня 2011

Вот моя проблема ... Я выполняю асинхронный вызов службы, с которой я работаю, которая возвращает результаты поиска мне.Когда это сделано, он перезагружает мою таблицу, и асинхронность завершена.Проблема заключается в том, что, когда я пытаюсь прокрутить свое табличное представление до выполнения асинхронного вызова, таблица теряет то плавное ощущение, которое есть во всех прокручиваемых представлениях.Под этим я подразумеваю, что когда вы отпускаете свиток, вместо того, чтобы продолжать двигаться и медленно останавливаться, он просто останавливается, как только вы отпускаете.Единственный способ восстановить ощущение текучести - это прокрутить до самого верха или низа UITableView и немного пройти, тогда все в порядке.

Вот мой код для асинхронного вызова:

__block NSMutableArray *appendMoreObjects = [[NSMutableArray alloc] init];

    dispatch_async( dispatch_get_main_queue(), ^{

        self.activity.hidden = NO;

        appendMoreObjects = [service search:self.query from:((moreCount * 8)) until:((moreCount * 8) + 8)];

        if( appendMoreObjects == nil )
        {
            //alert view
        }
        else
        {
            [self.allSearchResults addObjectsFromArray:appendMoreObjects];

            [self updateSearchArray];

            self.moreCount += 1;
        }

        self.activity.hidden = YES;
    });

Кроме того, имейте в виду, что я использую пользовательский UITableViewCell.Если нужна какая-либо другая информация, пожалуйста, запросите ее, и я посмотрю, что я могу сделать.Заранее спасибо.

EDIT1: [self updateSearchArray] содержит [tableView reloadData]

EDIT2: я тестирую на iPod Touch под управлением 4.3.1 (8G4)

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
customCell * cell = (customCell *)[tableView dequeueReusableCellWithIdentifier:@"cell"];

if( cell == nil )
{
    cell = [[[customCell alloc] initWithFrame:CGRectZero] autorelease];
}

if( indexPath.row == [self.searchResults count] && [self.searchResults count] > 0)
{

    UITableViewCell *moreCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease];
    moreCell.textLabel.text = @"More";
    moreCell.textLabel.textAlignment = UITextAlignmentCenter;

    return moreCell;
}

if( indexPath.row < [self.searchResults count] )
{
    [cell formatAndInsertData:[self.searchResults objectAtIndex:indexPath.row]];
}

return cell;
}

Решение:

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

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Вызов [tableView reloadData] перезагрузит ВСЮ таблицу, и именно поэтому вы видите прерывистый UITableView.Он заставляет все видимые ячейки обновляться, поэтому при прокрутке видимые ячейки обновляются и перекрашиваются.Вам нужно будет переоценить свою стратегию для обновления UITableView, поскольку у вас есть данные, поступающие, чтобы избежать этого.Вам следует обновить отдельные видимые ячейки, в которых есть данные, относящиеся к вашим обновлениям.

Для этого вам необходимо использовать следующие методы:

– insertRowsAtIndexPaths:withRowAnimation:

– deleteRowsAtIndexPaths:withRowAnimation:

– reloadRowsAtIndexPaths:withRowAnimation:

Сочетание этихпозволит вам обновлять таблицу (добавлять / удалять строки) по мере получения данных, а не принудительно обновлять всю таблицу.

0 голосов
/ 01 июня 2011

убедитесь, что вы перезагружаете только данные таблицы в главном потоке.предпочтительно я использую nsinvocation, а не GCD:)

0 голосов
/ 01 июня 2011

Я хотел бы увидеть пользовательскую ячейку, чтобы полностью ответить на вашу проблему.

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

И последнее, но не менее важное: на каком типе устройства вы тестируете?(тип и поколение)

РЕДАКТИРОВАТЬ:

Эта часть:

if( indexPath.row == [self.searchResults count] && [self.searchResults count] > 0)
{

    UITableViewCell *moreCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero] autorelease];
    moreCell.textLabel.text = @"More";
    moreCell.textLabel.textAlignment = UITextAlignmentCenter;

    return moreCell;
}

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

Используйте только cellForRowAtIndexPath: для простых вещей, таких как заполнение заголовков, описаний и изображений.

Выполните логику перезагрузки на контроллере таблицы, но где-нибудь безопаснее.CellForRowAtIndexPath будет загружаться каждый раз, когда появляется ячейка, даже если она была только на виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...