Заголовки раздела UITableView, вызывающие замедление просмотра таблицы - PullRequest
0 голосов
/ 16 января 2012

У меня есть UITableView, который загружает объекты из базовых данных, используя NSFetchedResultsController.В запросе на выборку в настоящее время используется размер пакета, чтобы контролировать издержки памяти, поскольку из выборки возвращается около 1000 строк.После подключения всего этого представление таблицы было действительно быстрым.

Теперь моя проблема связана с тем, что я хочу добавить группирование и заголовки разделов в представление таблицы.Я реализовал необходимые методы делегата, но кажется, что tableView:titleForHeaderInSection: вызывается для каждого возможного раздела в выборке во время загрузки.Я группирую по дате, поэтому во всем табличном представлении содержится около 700 разделов.Как вы можете догадаться, это замедляет первоначальную загрузку моего контроллера представления, потому что он должен извлекать все партии, чтобы добраться до заголовков моих разделов.Я ожидал, что этот метод будет вызываться подобно методам, которые загружают ячейки табличного представления - при прокрутке таблицы.

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

Некоторые замечания:

  • I am сообщая запрос на выборку перед ошибкой dateOfFlight, используя метод setPropertiesToFetch:.
  • Запрос на выборку имеет предельный размер пакета 25.
  • Запрос на выборку не имеет предела выборки.
  • Мне не нужны заголовки разделов.Для sectionIndexTitlesForTableView: я возвращаю Nil;
  • Из выборки возвращено около 1000 объектов, и, поскольку мы группируем по локализованной дате, существует около 700 разделов.

Что стоит, вот код, который я использую для загрузки заголовка раздела:

/**
 * We override this method from the base class because we need to format the date
 * prior to it being displayed in the UITableViewSection.
 * @author Jesse Bunch
 **/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    Flight *cellEntity = (Flight *)[[sectionInfo objects] objectAtIndex:0];

    if (cellEntity) {
        return [cellEntity.dateOfFlight localizedLongDateString];
    }

    return L(@"Unknown Date");

}

-

Редактировать

Я добился немного большегоскорость путем форматирования даты из названия раздела, а не самого объекта:

/**
 * We override this method from the base class because we need to format the date
 * prior to it being displayed in the UITableViewSection.
 * @author Jesse Bunch
 **/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    static NSDateFormatter *dateFormatter;
    if(nil == dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss ZZ";
    }

    id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    NSDate *sectionDate = [dateFormatter dateFromString:sectionInfo.name];  

    if (sectionDate) {
        return [sectionDate localizedLongDateString];
    }

    return L(@"Unknown Date");

}

1 Ответ

0 голосов
/ 16 января 2012

Задумывались ли вы о постепенной загрузке и отображении данных?

Я имею в виду: вы загружаете кучу данных и отображаете N строк (с N << 1000);если пользователь прокручивает последнюю строку, то загружается больше данных и отображается больше строк (и больше разделов). </p>

Я не уверен, что этот подход может решить вашу проблему (вполне возможно, что после некоторого числаиз pull-to-load, представление все равно становится медленным) но я думаю, что вы могли бы попробовать его ... возможно, пользовательский опыт также выиграл бы от этого (помимо медлительности).

ЕслиЕсли вы заинтересованы, вы можете взглянуть на EGOTableViewPullRefresh , в котором реализован аналогичный механизм для «вытягивания до перезагрузки».Это может быть полезно для обнаружения прокрутки за последней строкой.

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