Подтвердить что ты не робот

IOS Как асинхронно загружать и кэшировать изображения и видео для использования в моем приложении

У меня есть приложение iphone, которое отображает как изображения, так и видео. То, как приложение структурировано, большинство изображений и видео будет оставаться неизменным, причем время от времени добавляется. Я хотел бы получить мнение о наилучшем и простом методе асинхронной загрузки и кэширования изображений и видео, чтобы они сохранялись даже после выхода приложения. Кроме того, я действительно очень обеспокоен IOS 5 и более поздними версиями.

Вот некоторая информация, которую я нашел до сих пор, но я до сих пор не понял, что такое лучший метод, и если кеш будет постоянным.

Эта статья об асинхронном кэшировании изображений (старый 2009)

Эта статья о NSURLCache

SDWebImage (отлично смотрится, но работает только с изображениями)

AFDownloadRequestOperation

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

4b9b3361

Ответ 1

Это очень просто для загрузки и кеширования. Следующий код будет асинхронно загружать и кэшировать.

NSCache *memoryCache; //assume there is a memoryCache for images or videos

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    NSString *urlString = @"http://URL";

    NSData *downloadedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

    if (downloadedData) {

        // STORE IN FILESYSTEM
        NSString* cachesDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *file = [cachesDirectory stringByAppendingPathComponent:urlString];
        [downloadedData writeToFile:file atomically:YES];

        // STORE IN MEMORY
        [memoryCache setObject:downloadedData forKey:urlString];
    }

    // NOW YOU CAN CREATE AN AVASSET OR UIIMAGE FROM THE FILE OR DATA
});

Теперь у UIImages есть что-то особенное, что делает такую ​​библиотеку, как SDWebImage, такой ценной, даже если асинхронно загружать изображения так просто. Когда вы показываете изображения, iOS использует ленивую схему декомпрессии изображения, поэтому есть задержка. Это становится неровной прокруткой, если вы помещаете эти изображения в ячейки tableView. Правильное решение заключается в том, что изображение будет распаковываться (или декодироваться) в фоновом режиме, а затем отображать распакованное изображение в основном потоке.

Чтобы узнать больше о декомпрессии ленивого изображения, см. это: http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/

Мой совет - использовать SDWebImage для ваших изображений и код выше для ваших видео.

Ответ 2

Сильный компонент кэша изображений iOS должен:

  • загружать изображения асинхронно, поэтому основная очередь используется как можно меньше
  • распаковать изображения в фоновом режиме. Это далеко не тривиально. См. Сильную статью о декомпрессии фона
  • кэш-изображения в память и на диск. Кэш-память важна, потому что приложение может быть закрыто или необходимо очистить память из-за низкое состояние памяти. В этом случае повторная загрузка изображений с диска намного быстрее, чем их загрузка. Примечание. Если вы используете NSCache для кэш памяти, этот класс очистит все его содержимое, когда выдается предупреждение о сохранении памяти. Подробная информация о NSCache здесь http://nshipster.com/nscache/
  • сохранить распакованное изображение на диске и в памяти, чтобы избежать повторной декомпрессии
  • используйте GCD и блоки. Это делает код более эффективным, легче читать и писать. В настоящее время GCD и блоки являются обязательными для асинхронных операции
  • приятно иметь: категорию над UIImageView для тривиальной интеграции. приятно иметь: способность обрабатывать изображение после загрузки и до сохраняя его в кеше.

ДОПОЛНИТЕЛЬНОЕ ИЗОБРАЖЕНИЕ НА IOS


Чтобы узнать больше об изображениях на iOS, о том, как работают SDK-рамки (CoreGraphics, Image IO, CoreAnimation, CoreImage), CPU против GPU и больше, пройдите через отличную статью @rsebbe.

Источник: https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/

Ответ 3

-(void)tableView:(UITableView *)tableView 
willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIView *view = (UIView *)cell;

    view.transform = CGAffineTransformMakeScale(0.0, 0.0);

    [UIView animateWithDuration:0.3 animations:^{
        view.transform = CGAffineTransformIdentity;
    }];
}