Когда началось кэширование в 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? Может ли кто-нибудь подтвердить это или я просто представляю вещи?
Ответы
Ответ 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];