У меня есть 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");
}