Быстрее ли создавать UITableViewCell программно или загружать один из наконечника?
Профилировщик времени показывает, что самая трудоемкая операция в моем приложении - загрузка UITableViewCells
из файлов nib. Самый дорогой из них включает загрузку UITableViewCell
с изображением 4 КБ.
Я загружаю UITableViewCell
из nib следующим кодом:
[[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL];
cell = portraitCell;
self.portraitCell = nil;
Кто-нибудь сравнивал разницу между созданием представления программным способом или загрузкой UITableViewCell
из nib?
EDIT:
Я сравнил временной профиль повторных прогонов загрузки UITableViewCell
с наконечника и программного создания представления. Мой тест включал чередование между двумя UITableViews
примерно 10 раз в промежутке 3-5 секунд. В каждом тесте загрузка программного обеспечения UITableViewCell
была значительно быстрее, между 2x и 6x быстрее.
Может ли кто-нибудь подтвердить эти результаты?
EDIT:
Я обновил код загрузки nib, чтобы только один раз загрузить файл nib и использовать кешированную версию для последующих вызовов.
if (self.UITableViewPortaitNib == nil) {
self.UITableViewPortaitNib = [UINib nibWithNibName:@"UITableViewCellPortrait" bundle:[NSBundle mainBundle]];
}
self.UITableViewPortaitNib instantiateWithOwner:self options:NULL];
cell = portraitCell;
self.portraitCell = nil;
Я также использовал инструмент автоматизации для создания более последовательных прогонов, и результаты по-прежнему предполагают, что загрузка UITableViewCells
программно быстрее, чем загрузка UITableViewCells
для наконечника. Среднее время работы для загрузки UITableViewCells
из ниба составляло около 90 мс, а среднее время работы для создания UITableViewCell
программно составляло 50 мс.
Ответы
Ответ 1
Попробуйте создать объект UINib
один раз, а затем отправьте его instantiateWithOwner:options:
каждый раз, когда вам нужно создать новую ячейку. Из Ссылка на класс UINib:
Например, если в представлении таблицы используется файл nib для создания экземпляров ячеек таблицы, кеширование элемента в объекте UINib
может обеспечить значительное улучшение производительности.
Ответ 2
В iOS 5 и упоминается в видеороликах WWDC 2011, существует более новый метод, который использует UINib. Вы регистрируете свой nib в методе viewDidLoad:
, а затем упрощаете код в методе tableView:cellForRowAtIndexPath:
. Это может ускорить процесс для вас (но я никогда не выполнял никаких сравнительных таймингов).
Пример:
В вашем регистре viewDidLoad:
напишите и сохраните ссылку на него:
NSString *myIdentifier = @"ReusableCustomCell";
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier];
В вашем методе tableView:cellForRowAtIndexPath:
просто попросите ячейку (нет необходимости проверять нуль, поскольку она гарантированно вернет ячейку под iOS5) и настройте ячейку:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *myIdentifier = @"ReusableCustomCell";
ReusableCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
// Your configuration code goes here
cell.nameLabel.text = @"some text";
// ....
return cell;
}
Код не проверен. Мне было бы интересно, если бы это было быстрее, чем с использованием только UINIB.
Ответ 3
Я загружаю ячейку nib (cellTemplate
) один раз и дублирую ее по мере необходимости, поэтому в некотором смысле этот подход является программным и основанным на nib.
Дублирование было более сложным, чем я ожидал, поскольку mutableCopy
не работал. Тем не менее, NSKeyedArchiver
roundtrip:
NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate];
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];
На самом деле, если вы собираетесь работать с сырой, пылающей скоростью от педали до металла, даже архивный шаблон можно вычислить один раз и кэшировать.
Но разве вы не должны измерять частоту кадров? В этом случае сложность UIView также входит в игру.
Ответ 4
Можно повторно использовать наконечники uitableviewcell, которые когда-то загружены, и затем они выходят из вида. Прочтите следующее:
iPhone - Что такое reuseIdentifiers (UITableViewCell)?