Я уже некоторое время пользуюсь @ atebits's ABTableViewCell .Для тех, кто не знаком с ним, в основном он делает прокрутку табличного представления намного быстрее, рисуя все метки и изображения, вместо выделения объектов UIKit (таких как UILabels, UIImageView и т. Д.).
Теперь у меня есть довольно большое UITableViews
, и в каждой ячейке есть маленькое (32x32) пользовательское изображение и средняя (75x75) миниатюра фотографии.Рисование действительно помогает ускорить прокрутку таблицы, но я все еще пытаюсь понять, как лучше всего получить эти изображения, которые должны быть нарисованы внутри ячеек.
Я смотрел на Apple LazyTableView пример, но я все еще не уверен, каков наилучший способ сделать это.Все, что я знаю, это то, что чем меньше кода / выделения у вас в cellForRowAtIndexPath:
, тем лучше.
Поэтому мои изображения либо загружаются с сервера, либо извлекаются из моего CoreDataHelper.Мой вопрос: , какой из следующих методов лучше извлечь кэшированные изображения ?
Используйте NSFetchRequest
в cellForRowAtIndexPath:
для извлечения кэшированного изображения (поэтомувыделение экземпляров NSFetchRequest во время прокрутки таблицы).
Сохранить все кэшированные изображения с самого начала в источнике данных tableView, так что я могу просто извлечь их из (уже выделенного массива в viewDidLoad:
) источник данных у меня UITableViewController
.Этот метод явно занимает больше памяти, так как он выделяет кучу маленьких изображений, но я предполагаю, что прокрутка в итоге станет намного более плавной.
Может кто-нибудь подсказать мне об этом?
(Кстати, я хочу, чтобы изображения появлялись при прокрутке таблицы . Ожидание остановки прокрутки при загрузке изображений не вариант).
РЕДАКТИРОВАТЬ: загрузка изображений с диска
Следуя предоставленным ответам, я сейчас пытаюсь загрузить изображения непосредственно с диска (после их сохранения, очевидно) с использованием изображениялокальный путь, который является частью источника данных tableview.Вот код внутри метода cellForRowAtIndexPath:
:
NSData *imageData = [NSData dataWithContentsOfFile:imageLocalPath];
UIImage *userImage = [UIImage imageWithData:imageData];
cell.avatarImage = userImage;
Это все еще не гладко (есть небольшая задержка каждый раз, когда появляется новая ячейка (каждый раз, когда вызывается cellForRowAtIndexPath
). Должен ли я сделать этот вызовАсинхронно? Или чтение с диска достаточно быстрое и определенно не является проблемой здесь?
РЕДАКТИРОВАТЬ: Подробнее
1. Где вы получаетеthe imageLocalPath?
URL-адрес изображения является частью моего dataSource, который представляет собой NSArray, выделенный в viewDidLoad (кэшируется в CoreData, но это не должно влиять на прокрутку). Путь к каталогу документов приложения также сохраняется вviewDidLoad, поэтому весь путь к файлу вычисляется в cellForRowAtIndexPath с использованием
NSArray *urlArray = [picURLString componentsSeparatedByString: @"/"];
NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsPath, [urlArray lastObject];
2. Что происходит, когда вы запускаете это через акулу?
Я никогда раньше не использовал Shark, пробовалиспользовать его и, по-видимому, iOS 4. больше не поддерживает его. Вы можете это подтвердить? Когда я нажимаю кнопку «Пуск», ничего не происходит.
3. Какой FPS вы получаете в Instruments на устройстве?
Я получаю от 25 до 30 кадров в секунду, но на самом деле это не выглядит так гладко на реальном экране.Не уверен, что это что-то значит.Я чувствую, что получаю 10-15 кадров в секунду.Опять же, плавная прокрутка между ячейками, просто когда табличное представление попадает в новую ячейку, возникает небольшая задержка (такая быстрая прокрутка = многие из этих маленьких задержек каждую секунду).