iphone tableview с большим количеством изображений

У меня есть UITableView, который отображает много изображений в ячейках, и я не очень доволен производительностью прокрутки. Мой UITableView чем-то похож на фотоприложение на айфоне. Кто-нибудь знает, почему приложение iphone foto прокручивается так чертовски быстро, как будто на экране ничего нет.

И есть ли у кого-нибудь советы/рекомендации по увеличению производительности/скорости прокрутки?


person Ton    schedule 08.08.2009    source источник


Ответы (3)


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

NSDate *date = [NSDate date];
... your cell loading code ...
NSLog( @"Elapsed time to generate cell %.2d", [date timeIntervalSinceNow] );

Вы увидите, сколько времени вы тратите на получение каждой ячейки.

Чтобы обойти это, вы можете быть настолько сложными, насколько вам нужно: если у вас много изображений, вам придется быть все более и более умным. Вы можете выполнить постраничную загрузку, где вы отслеживаете NSIndexPath последней запрошенной ячейки и определяете, идет ли прокрутка вверх или вниз, и используете +NSImage:imageNamed: для получения сразу нескольких страниц изображений вперед (т. е. на 5 изображений вперед от вашего текущего положения) или что-то еще, что вам подходит (используя тот факт, что людям приходится возвращать палец вниз к нижней части таблицы, чтобы снова провести пальцем, и, таким образом, потребление элементов таблицы имеет паузы — вы можете сделать размер страницы достаточно большим, чтобы заполнить свайп). Это, вероятно, все еще не очень хорошо, потому что вы просто будете страдать от всего своего воздействия сразу, а не от дрожащей нагрузки на каждую ячейку.

Вы можете быстро вернуть управление пользовательскому интерфейсу и позволить системе запланировать предварительно загруженную страницу изображений с помощью NSRunLoop:performSelector:target:argument:order:mode: вне основного цикла выполнения, используя NSImage:imageNamed:, а затем, когда запрашивается ячейка, если вы выполняете выборку достаточно далеко вперед, она будет доступна для отображения.

Вы должны быть болезненно осведомлены о проблемах с памятью. Если вы считаете, что это проблема, используйте NSImage:initWithContentsOfFile:, который очищает кэши изображений в ситуациях нехватки памяти. В зависимости от стратегии, используемой алгоритмом аннулирования кеша, эти ситуации могут вызвать «заикание» при очистке кешей и необходимости перезагрузки недействительных предварительных выборок.

person groundhog    schedule 08.08.2009
comment
Мне не нужно использовать прокрутку, которую предложил Даниэль? Это их разница? - person Ton; 08.08.2009
comment
Нет, на самом деле комментарий Дэниэлса немного странный, потому что, на мой взгляд, приложение для фотографий загружает целую сетку фотографий на экране, четыре в ширину. Это намного сложнее, но то, что они делают, это сохраняет миниатюру и использует ее. Он по-прежнему не совсем гладкий, если вы быстро проводите пальцем, он немного заикается. Таблица на самом деле проще, потому что она позволяет вам знать, когда ожидать необходимости получения большего количества изображений. - person groundhog; 08.08.2009

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

person prairiedogg    schedule 08.08.2009
comment
Обсуждение в блоге, на который вы ссылаетесь, не подходит для этого вопроса - в нем говорится о производительности компоновки в iphone и рекомендуется позаботиться об этом, внедрив собственный код рисования для использования полной непрозрачности. Этот вопрос, вероятно, не страдает от этой проблемы. Как правило, если у вас нет веской причины, вы не должны расширять саму ячейку! Гораздо лучше добавить в contentView и установить backgroundView, чтобы анимация таблицы обрабатывалась правильно. - person groundhog; 08.08.2009

Проблема здесь заключается в памяти, вы загружаете слишком много изображений с высоким разрешением одновременно, приложение foto не использует табличное представление, оно использует представление прокрутки, и оно загружает максимум 3 изображения за раз, поэтому память не является проблемой, если вы пытаетесь сделать что-то похожее на приложение foto, используйте прокрутку

person Daniel    schedule 08.08.2009