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

Когда началось кэширование в UIWebView?

Я тестировал контроллер представления 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 (на iPhone, Настройки → WiFi, ручной прокси) и запись трафика на мой сервер.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED

Но метод

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

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

Ответ 3

NSURLCache* theCache = [NSURLCache sharedURLCache];
[theCache setMemoryCapacity:4 * 1024 * 1024];
[theCache setDiskCapacity:512*1024];

[NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0];