iOS: асинхронно загружать изображения из Интернета *, если * они не существуют в файловой системе? - PullRequest
1 голос
/ 17 августа 2011

В моем приложении для iOS я использую Core Data для моделирования ряда сущностей, которые существуют в удаленном приложении Ruby on Rails. Ряд этих объектов ссылается на URL-адреса изображений, хранящихся на S3, которые мне необходимо загружать и хранить по мере необходимости на iDevice пользователя.

Мои конкретные требования:

  1. Отображение изображения (обычно в UITableView или отдельно) из файловой системы local .

  2. ЕСЛИ изображение не существует локально, мне нужно иметь возможность загрузить его в фоновом режиме (обычно нужно загрузить два изображения: миниатюру и оригинал). Изображение по умолчанию должно отображаться до тех пор, пока загруженное изображение не будет сохранено.

  3. После загрузки изображения его необходимо сохранить в файловой системе и отобразить на экране.

Я знаю, что есть ряд связанных постов, но мне интересно услышать о том, что вы все сочли бы рекомендуемым подходом, основанным на моих конкретных потребностях. Кроме того, есть ли какие-то ошибки, с которыми мне следует опасаться?

Спасибо -wg

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Используйте ASIHTTPRequest. Прочитайте раздел об использовании кэша загрузки здесь - http://allseeing -i.com / ASIHTTPRequest / Как использовать

В основном вы захотите включить кеш, который вы можете сделать для всех запросов или только для ваших запросов изображений:

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]]; // all requests

// specific requests
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];

Тогда вы, вероятно, захотите использовать политику кэширования:

ASIOnlyLoadIfNotCachedCachePolicy

и политика хранения:

ASICachePermanentlyCacheStoragePolicy

Однако несколько политик кэширования удовлетворят ваши потребности.

Я рекомендую использовать ASI, потому что он решает множество проблем в приложении. Недавно я разработал свою собственную сетевую библиотеку, частично в качестве упражнения, а частично потому, что я не знал об ASI и не любил другие варианты, которые я нашел в то время. Я недавно начал использовать все для использования ASI, и я очень доволен своим выбором

0 голосов
/ 17 августа 2011

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

Чтобы реализовать это, я определил протокол ResourceURLProvider в файле заголовка для класса, который будет загружать файлы:

@protocol ResourceURLProvider
    -(NSURL *)getURLForFile:(NSString *fileName);
@end

@interface MyFileLoader {
    id<ResourceURLProvider> provider;
}
@property (nonatomic, assign) id<ResourceURLProvider> provider;

В своем классе реализации я сделал что-то вроде этого:

NSURL *url = [provider getURLForFile:@"myfile.xml"];
if (!url) {
    url = // Some code to create the URL for the remote myfile.xml
}

Если вы настроили что-то подобное, вы можете реализовать свою версию провайдера (как бы вы ее ни называли) и вернуть ему URL-адрес кешированного файла, если он существует.Если нет, вы вернете nil и приведенный выше код будет использовать URL-адрес для удаленного расположения.

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

   @protocol ResourceURLProvider
    -(NSURL *)getURLForFile:(NSString *fileName);
    -(void)cacheFileData:(NSData *)data filename:(NSString *)fileName;
   @end

Ваша реализация проверила бы имя файла и проверила, был ли файл уже кэширован.Если нет, NSData (содержимое файла) будет записано в ваш кэш.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...