Когда кеширование в UIWebView начало работать? - PullRequest
13 голосов
/ 25 июля 2011

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

Предыдущие SO вопросы о кешировании UIWebView:

Эти посты были довольно дефлятирующими, но я заметил, что их все спрашивали до выхода iOS 4.0.Я протестировал следующий подход к кешированию, который казался довольно простым:

NSURLRequest *request = [NSURLRequest requestWithURL:myUrl 
      cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
[webView loadRequest:request];

Кажется, это прекрасно работает на iOS 4.3, но совсем не работает на iOS 3.0.Я проверил это, указав устройства на Charles proxy (на iPhone, Настройки -> WiFi, Ручной прокси) и записав трафик на мой сервер.

UIWebView начал наблюдать за кэшемполитика в iOS 4.0?Кто-нибудь еще может это подтвердить или я просто воображаю?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2013

Да, в iOS 4.0 начал работать кеш.

В среде Foundation есть класс, отвечающий за это, это NSCache. Он был в Mac OS X с давних пор, но он не был реализован в iOS до iOS 4.0. Даже тогда он был реализован лишь частично: он не поддерживал кэширование на диске, а только кэширование памяти (поэтому кэш был очень ненадежным из-за освобождения памяти по запросу системы).

NSCache получил обновление в iOS 5.0, в котором добавлена ​​поддержка кэширования на диске, и теперь оно работает как версия для Mac и может использоваться без проблем.

0 голосов
/ 30 октября 2012
NSURLCache* theCache = [NSURLCache sharedURLCache];
[theCache setMemoryCapacity:4 * 1024 * 1024];
[theCache setDiskCapacity:512*1024];

[NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];
0 голосов
/ 26 июля 2011

Я только что проверил NSURLRequest.h

Большая часть кода в iOS SDK, в котором есть подтверждение версий, имеет оператор if, что-то вроде этого:

#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED

Но метод

- (id)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;

, кажется, не имеет ничего подобного, поэтому я бы предположил, что он был там навсегда.

...