Предварительно кэшированные изображения для категории UIImageView AFNetworking

Когда мое приложение загружается, я вытаскиваю JSON-представление 99 объектов.

У каждого объекта есть поле «image_url», которое я передаю в setImageWithURLRequest AFNetworking.

Мои изображения загружаются в tableView, и, следовательно, только первые несколько ячеек запрашивают свои изображения. Только после того, как я прокрутю вниз, будут сделаны последующие запросы изображений.

Как только я вытащу начальный набор данных, я хотел бы иметь возможность запустить фоновый процесс, который выходит и загружает 95 или около того объектов, которые изначально не видны, и кэширует их таким образом, чтобы при вызове setImageWithURLRequest , у него уже есть кешированное изображение, из которого можно извлечь данные.

Однако AFImageCache является частным, поэтому я не уверен, что это возможно. Я знаю, что мог бы кешировать с помощью NSURLCache, но тогда у меня было бы два отдельных изолированных кеша, и это тоже не идеально.

Является ли мой единственный вариант не использовать категорию UIImageView AFNetworking?

Эти ответы заставляют меня думать так:

Кэширование изображений iOS с помощью AFImageCache не работает
Как настроить кэш при использовании setImageWithURL AFNetworking< /а>


person djibouti33    schedule 28.06.2012    source источник
comment
Кэширование 95 изображений в оперативной памяти потребует много оперативной памяти. Если вы сделаете это, пожалуйста, не используйте встроенный кеш, а создайте дисковый кеш в каталоге кеша.   -  person Kyle Howells    schedule 07.07.2012
comment
У меня точно такая же проблема. Я кэширую изображения на диск. Но когда я пытаюсь загрузить их из кеша, иногда они не обнаруживаются. Я задал вопрос на stackoverflow.com/questions/12882639/   -  person Burak    schedule 14.10.2012


Ответы (4)


Пожалуйста, пожалуйста, не делайте этого.

Поверьте мне, когда я говорю, что в этом почти наверняка нет необходимости.

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

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

person mattt    schedule 03.07.2012
comment
Как мне предварительно загрузить только следующие 3 или 4 изображения? - person Daniel X Moore; 19.02.2013

Я бы НЕ стал создавать кучу UIImageView для достижения вашей цели, это было бы действительно неэффективным подходом.

Вы можете добавить свой собственный метод в UIImageView+AFNetworking.h для достижения этой возможности. Я думаю, что это был бы лучший подход. Непроверенный пример:

+ (void) cacheImageWithURL:(NSURL *)url 
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [request setHTTPShouldHandleCookies:NO];
    [request setHTTPShouldUsePipelining:YES];

    AFImageRequestOperation *requestOperation = [[[AFImageRequestOperation alloc] initWithRequest:request] autorelease];
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:request];
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {}];
}
person Michael Frederick    schedule 03.07.2012

Вот решение: создайте несколько объектов UIImageView (но не добавляйте их в качестве подзаголовков), а затем используйте категорию UIImageView AFNetworking для извлечения изображений и заполнения внутреннего кеша.

Образец кода:

NSArray *strings = [NSArray arrayWithObjects:
                    @"http://i.imgur.com/IpQzE.png",
                    @"http://i.imgur.com/sDnLs.jpg",
                    nil];

for (NSString *string in strings) {
    UIImageView *imageView = [[[UIImageView alloc] init] autorelease];
    [imageView setImageWithURL:[NSURL URLWithString:string]];
}
person Nick Dowell    schedule 02.07.2012
comment
интересный. на самом деле у меня была такая же мысль, но я не был уверен в дополнительных накладных расходах на все UIImageViews, которые я буду создавать. Разве это не то, о чем мне нужно беспокоиться? я бы сделал это со 100-500 изображениями. - person djibouti33; 03.07.2012
comment
Использование памяти объектами UIImage будет намного больше, чем у UIImageViews (особенно если они никогда не добавляются в качестве подвидов). Какую бы стратегию вы ни выбрали, вам придется тщательно проверить ее работоспособность с помощью инструментов на реальном оборудовании. Вы можете вызвать предупреждения о памяти при загрузке такого количества изображений, что приведет к очистке кеша изображений (см. документацию для NSCache). - person Nick Dowell; 03.07.2012

Вы, вероятно, захотите рассмотреть Fully-Loaded

Простой самообслуживаемый кеш предназначен для загрузки изображений и сохранения в файле с именем, зависящим от URL-адреса.

Всякий раз, когда вы хотите загрузить изображение с URL-адреса, попробуйте сначала прочитать с жесткого диска - если было возвращено nil, продолжайте использовать загрузчик изображений.

Однако не забудьте очистить кеш изображений.

person xingzhi.sg    schedule 03.07.2012