Работает ли на iPhone кеширование дисков с NSURLRequest и NSURLConnection? - PullRequest
4 голосов
/ 01 марта 2010

У меня есть UITableView, чьи ячейки содержат пользовательские ImageViews, которые асинхронно загружают изображения из Интернета. Для загрузки этих изображений я использую NSURLRequest и NSURLConnection, который отлично работает. Единственная проблема заключается в том, что изображения не кэшируются и, следовательно, загружаются при каждом их использовании. Я попытался установить cachePolicy NSURLRequest в «NSURLRequestReturnCacheDataElseLoad» безрезультатно.

Из последнего ответа на link видно, что кеширование диска не поддерживается NSURLRequest на iPhone. Это правильно?

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

Вот код:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myurl"] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60.0];


connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

Ответы [ 2 ]

3 голосов
/ 01 марта 2010

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

Если вы можете опубликовать ссылку на одно из изображений, тогда мы можем присмотреться.

HTTP/1.1 200 OK
Date: Mon, 01 Mar 2010 12:40:46 GMT
Server: Apache
Last-Modified: Mon, 01 Mar 2010 09:33:29 GMT
ETag: "25e8dd2-11a6-480b9f1178c40"
Accept-Ranges: bytes
Content-Length: 4518
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/png

Это то, что одно из ваших изображений возвращает в качестве заголовков. Я не вижу заголовок Expires или Cache-Control, поэтому может быть, поэтому они не кэшируются. Я думаю, что с точки зрения WebKit, это динамический контент, который должен каждый раз перезагружаться.

0 голосов
/ 16 ноября 2014

NSURLCache кэширование на диске работало с iOS 5. По умолчанию NSURLCache не использует кэширование на диске, вы должны включить его самостоятельно:

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024512) diskCapacity:(1024*1024*1024 * 100) diskPath@"Cache.db"];
[NSURLCache setSharedURLCache:cache];

Это установит глобальный URLкеш для использования в системе загрузки URL.По большей части это будет «просто работать».Если в вашем запросе используется значение NSURLRequestUseProtocolCachePolicy (по умолчанию), система загрузки URL-адресов будет кэшироваться с указанием времени жизни, указанного в ответе удаленного сервера.Такие службы, как REDbot , могут сообщить вам, каким будет время жизни кэша данного ответа.

NSURLSessionConfiguration можно настроить на использование отдельных кэшей, однако на практике это не работает, как описано,Начиная с iOS 8, если настроено несколько NSURLCache, будет использоваться только первый.

При использовании на дисковом хранилище с NSURLCache существуют дополнительные недокументированные действия: - Если для diskCapacity установлено значение менее 5 МБ, он не будет использоваться.- Очистка и изменение размера кэша часто не работает должным образом.Некоторые из них были исправлены в iOS 8, некоторые - нет.- currentDiskUsage информация часто неверна.- В некоторых выпусках iOS NSURLCache игнорирует ограничение, установленное diskCapacity, и увеличивает кэш на диске без ограничений.

Тем не менее, NSURLCache при кэшировании на диске обычно делает правильные вещи.Если вы создадите кэш на диске, как указано выше, при запуске приложения кэш сохранит ответы на диск, и система загрузки URL будет использовать эти кэшированные ответы.После того, как вы установили кеш, как описано выше, вам не нужно напрямую взаимодействовать с кешем - система загрузки URL сделает это за вас.Исключение составляет NSURLSession, где кэширование все еще немного нарушено.

...