iphone tableview с большим количеством изображений - PullRequest
2 голосов
/ 08 августа 2009

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

А у кого-нибудь есть какие-нибудь советы / хитрости для увеличения моей производительности / скорости прокрутки?

Ответы [ 3 ]

3 голосов
/ 08 августа 2009

Тебе следует предварительно кэшировать свои изображения, а не делать это лениво. При прокрутке таблицы вызывается метод 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: executeSelector: target: аргумент: порядок: режим: отключить основной цикл запуска с помощью NSImage: imageNamed: и затем при запросе ячейки, если вы извлекаете достаточно далеко вперед, она будет доступна для отображения.

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

0 голосов
/ 08 августа 2009

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

0 голосов
/ 08 августа 2009

Об отличных результатах прокрутки сообщили, создав подкласс UITableViewCell и непосредственно рисуя содержимое каждой ячейки См. Принятый ответ для этого вопроса для получения дополнительной информации и ссылок на примеры кода.

...