Существует множество сторонних библиотек для загрузки сетевого изображения, а затем их хранения в диск и/или память.NSURLSession для загрузки сетевых изображений + кэш
Однако это очень просто для его реализации с использованием простого вызова API NSURLSession.
вот код:
NSURLCache *myCache = [[NSURLCache alloc] initWithMemoryCapacity: 16384 diskCapacity: 268435456 diskPath: cachePath]; // these numbers are only for the usage example.
defaultConfigObject.URLCache = myCache;
defaultConfigObject.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
_session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
_dataTask = [_session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
if (!error){
UIImage* theImage = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
self.image = theImage;
});
}
}];
[_dataTask resume];
Этот код загружает изображение (из данного URL) и сохранить его в памяти + диск в соответствии с политикой кэширования HTTP.
Получение MyNetworkImageView из UIImageView и добавление вышеуказанного кода в метод setURL: также прямолинейный.
Мой вопрос:
Каковы преимущества использования других механизмов третьих сторон, таких как AFNetworking, FastImageCache, SDWebImage, SDImageCache?
Кэширование в 'NSURLSession' зависит от (a) размера загрузки относительно размера кеша; и (б) заголовки ответа. Я бы очень стресс протестировал ваше приложение и убедился, что кеширование (esp persistent cache cache) работает так, как вы думаете. Ваш кэш памяти кажется очень маленьким (и все, что превышает 5% от размера кеша, не будет кэшироваться). Итог, полагаясь на «NSURLCache» в iOS, в прошлом был проблематичным, особенно если вы не контролируете сервер. Эти классы также предлагают другие преимущества (например, с категориями «UIImageView»). – Rob
Спасибо, Роб. Я отредактировал свой вопрос за ваши замечания. в отношении размера кэша памяти, это только для примера использования, там нет реальных рабочих номеров. что касается проблемы NSURLCache в iOS, я вспоминаю такие проблемы, но я считаю, что они больше не актуальны в iOS8 и выше. наконец, предполагая, что сервер определяет поведение кэширования, есть ли больше преимуществ? –
ОК. Обычно я ожидал, что кеш памяти будет в MB, а не в KB. :) Успех кеширования «NSURLCache», я бы предложил только эмпирически проверить это, во-первых. Но если 'NSURLSession' работает для ваших нужд, тогда идите и просто используйте это. Я бы отступил назад и подумал о более широких сетевых потребностях приложения, но если вам не нужно сложное создание/обработка HTTP-запросов, а также категории «UIImageView» и т. Д., Просто используйте «NSURLSession». – Rob