Это быстрее, чтобы создать UITableViewCell программно или загрузить один из кончика? - PullRequest
15 голосов
/ 13 декабря 2011

Профилировщик времени показывает, что в моем приложении самая трудоемкая операция - загрузка UITableViewCells из nib-файлов. Самый дорогой из них включает загрузку UITableViewCell изображения размером 4 КБ.

Я загружаю UITableViewCell из пера со следующим кодом:

    [[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;

Кто-нибудь сравнивал разницу между созданием представления программным способом или загрузкой UITableViewCell из пера?

EDIT:
Я сравнил временной профиль повторных запусков загрузки UITableViewCell из кончика и создания представления программно. Мой тест включал чередование двух UITableViews около 10 раз в течение 3-5 секунд. В каждом тесте загрузка UITableViewCell программно была существенно быстрее, в 2-6 раз быстрее.

Может ли кто-нибудь подтвердить эти результаты?

EDIT: Я обновил код загрузки пера, чтобы загружать файл пера только один раз и использовать кэшированную версию для последующих вызовов.

    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 мс.

Ответы [ 4 ]

13 голосов
/ 13 декабря 2011

Попробуйте создать объект UINib один раз, а затем отправлять его instantiateWithOwner:options: каждый раз, когда вам нужно создать новую ячейку.Из ссылки на класс UINib :

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

5 голосов
/ 13 декабря 2011

В iOS 5, упомянутой в видеороликах WWDC 2011, есть более новый метод, использующий UINib. Вы регистрируете свое перо в методе viewDidLoad:, а затем упрощаете код в методе tableView:cellForRowAtIndexPath:. Это может ускорить процесс для вас (но я никогда не проводил сравнения).

Пример: В вашем viewDidLoad: зарегистрируйте перо и сохраните ссылку на него:

NSString *myIdentifier = @"ReusableCustomCell";
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier];

В вашем методе tableView:cellForRowAtIndexPath: просто запросите ячейку (не нужно проверять nil, поскольку гарантированно будет возвращать ячейку под 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.

2 голосов
/ 13 декабря 2011

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

Дублирование было более сложным, чемЯ ожидал, что mutableCopy не работает.NSKeyedArchiver туда и обратно сделал, однако:

NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate];
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];

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

Но разве вы не должны измерять частоту кадров?В этом случае в игру вступает и сложность UIView.

0 голосов
/ 13 декабря 2011

Возможно многократное использование перьев uitableviewcell, которые когда-то загружаются, и затем они выходят из вида. Прочитайте следующее:

iPhone - Что такое reuseIdentifiers (UITableViewCell)?

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