2011-01-06 4 views
1

У меня есть прокручиваемая сетка фотографий, которая выглядит и работает в точности так же, как и подборщик фотографий на iPhone. Он построен из UITableView, который использует пользовательский UITableViewCell, который отображает ряд фотографий (очень похоже на то, как Three20 реализует его).Улучшение производительности прокрутки UITableView при загрузке изображений

Он отлично работает, за исключением того, что производительность прокрутки плохая. Я уже придерживаюсь большинства лучших практик быстрой прокрутки UITableView (à la Tweetie).

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

Проблема в том, что в первый раз, прокручивая представление таблицы, прокрутка неустойчива. Я профилировал приложение и обнаружил, что большую часть времени тратится на загрузку изображений из файловой системы. Они являются изображениями JPEG, уже правильно настроенными (малыми). Вместо этого я попытался использовать PNG-изображения, но производительность не очень улучшилась.

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

Любые другие идеи о том, как я могу улучшить производительность?

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

ответ

2

Одна вещь, которую можно попробовать, может быть предварительно кэшировать все изображения при загрузке представления. Помимо этого, возможно, загрузка изображений в фоновом режиме (даже если это загрузка из файловой системы, а не из Интернета). Я не пробовал это сам, но, возможно, вы могли бы использовать что-то вроде https://github.com/rs/SDWebImage и указали, что URL-адреса указывают на файловую систему. Сначала пользователи могут видеть некоторые изображения-заполнители, но тогда пользовательский интерфейс не будет заикаться во время загрузки изображений.

+0

Я пробовал обе методики: предварительное кэширование и асинхронная загрузка. Загрузка Async выглядела ужасно, так как изображения загружаются так быстро, но достаточно медленно для заметного мерцания. Предварительное кэширование отлично работало. Я беспокоюсь о том, что происходит, когда мне нужно предварительно кэшировать 350 изображений за несколько месяцев (в настоящее время мне нужно только предварительно кэшировать 100), но я перейду через этот мост, когда я доберусь до него. Спасибо за отличный ответ. –

+1

Добро пожаловать! Для асинхронной загрузки это может выглядеть лучше, если у вас нет изображения-заполнителя, а вместо этого просто пустая область, где будет отображаться изображение.Это может помешать мерцанию. –

0

У меня была аналогичная проблема с использованием UITableView для отображения информации, анализируемой с помощью RSS-канала. Я столкнулся с прокруткой проблем с производительностью, когда было значительное количество данных. Хотя я все еще работаю над этим, я приостанавливаю синтаксический анализ, когда прокручивается таблица. Он возобновляется, когда прокрутка останавливается. Я не на своем компьютере, но я считаю, что использовал tableViewDidScroll и tableViewDidEndDecelerating. Вы можете проверить эти делегаты таблицы. В любом случае это работает очень хорошо, мне просто нужен более элегантный способ приостановить мой синтаксический анализ.

+0

Joe, если вы разбираете RSS-канал в фоновом потоке, попробуйте установить приоритет потока на 0 (поместите это в начало вашего кода фонового потока: '[NSThread setThreadPriority: 0]'). Я нашел, что для меня очень хорошо работает, и это может также решить вашу проблему более элегантно. –

-1

Фантастический. Это работает как шарм! Поэтому я эффективно использовал insertRowAtIndexPath, чтобы перезагрузить таблицу. Теперь он ведет себя так, как это

Большое спасибо! Joe

0

Отключение свойства PagingEnabled улучшает производительность прокрутки.

Смежные вопросы