Каковы рекомендуемые способы оптимизации памяти и скорости использования пользовательских UITableViewCells с несколькими UIImages? - PullRequest
1 голос
/ 05 февраля 2011

Я использую пользовательский UITableViewCell с 3 UIImages в UITableView с 50-100 строками. Он похож на UITableViewCell, который приложение Facebook iPhone использует для просмотра новостей.

Приложение имеет 4 аналогичных UITableView, которые могут быть открыты одновременно через UITabConroller.

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

Эта установка очень быстрая, но занимает много памяти даже после использования NSMutableDictionary для повторного использования изображения.

Я пробовал вариант без NSMutableDictionary, где изображения либо загружаются с сервера, либо извлекаются из дискового кэша каждый раз, когда вызывается cellForRowAtIndexPath. Эта настройка чрезвычайно эффективна при использовании памяти, но вызывает заметную задержку при прокрутке UITableView.

Средним способом является освобождение NSMutableDictionary для изображений при получении предупреждения о нехватке памяти.

Буду очень признателен за рекомендации по оптимизации использования и скорости памяти в этом сценарии, а также за понимание того, как приложение Facebook iphone или Three20 реализуют это концептуально.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

У меня есть приложение, которое во многих отношениях очень похоже на ваше (использует Three20, имеет несколько вкладок в нижней части, каждая вкладка может иметь таблицу, каждая ячейка может иметь одно или два изображения);и подход, который я использую, - тот, который вы упомянули ближе к концу вашего поста:

Средний подход - освободить NSMutableDictionary для изображений при получении предупреждения о нехватке памяти.

Лично мне очень нравится подход iOS к управлению памятью, предупреждающий меня, когда память становится тесной.Подход Mac / PC «просто используйте всю нужную память, мы выгрузим ее на диск, если объем памяти будет ограничен», имеет недостаток, заключающийся в том, что, хотя ОС является единственной, кто действительно знает, какое давление на память, это не говорит вам.Я думаю, что каждое вежливое приложение действительно хотело бы сказать (если бы приложения могли говорить): «Я был бы рад использовать столько памяти, сколько вы мне дадите, но я не хочу беспокоиться, я неЯ не хочу замедлять работу других приложений, поэтому, если вы могли бы дать мне подсказку о том, сколько памяти я могу использовать, не вызывая проблем, я был бы признателен. "

Хорошо, это то, что дают предупреждения о памяти в iOS.Вы, по моему мнению.Поэтому храните в памяти столько изображений, сколько хотите;и когда вы получите предупреждение о памяти, очистите кэш в памяти.Для меня это действительно лучшее из обоих миров.

Кроме того, вам определенно стоит взглянуть на Three20's TTURLCache, хотя я не могу вам много рассказать об этом, потому что я не очень углубился в это.много.Что я знаю, так это:

  • Если вы извлекаете свои сообщения с помощью TTURLImageResponse, они автоматически кэшируют их в кэше изображений TTURLCache.
  • Вы также можете сохранять изагрузите ваши собственные изображения (и другие данные) в TTURLCache.

Three20, похоже, использует подход, аналогичный тому, о котором я говорю.Взгляните на этот код из Three20Network / Sources / TTURLCache.m (аргумент NO означает не удалять с диска, а только удалять из памяти):

- (void)didReceiveMemoryWarning:(void*)object {
  // Empty the memory cache when memory is low
  [self removeAll:NO];
}

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

1 голос
/ 05 февраля 2011

вы удаляете изображения, когда они выходят за пределы экрана, а затем при необходимости читаете изображения из кэша локалей из вторичного рабочего потока. поскольку можно перемещаться по таблицам, добавьте поддержку отмены чтения (особенно для запросов, которые приходят с сервера). NSOperation - хороший API для этого.

если вы знаете, что ваш стол маленький, то в таких случаях вы можете избежать очистки.

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

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

...