Действительно ли кэширование диска с помощью NSURLRequest и NSURLConnection работает на iPhone?

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

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

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

Вот код:

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


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

person kiteloop    schedule 28.02.2010    source источник


Ответы (2)


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

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

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, я считаю, что это динамический контент, который нужно каждый раз перезагружать.

person Stefan Arentz    schedule 01.03.2010

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

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:(1024*1024*512) 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, где кеширование все еще кажется немного нарушенным.

person quellish    schedule 16.11.2014