Я только что провел слишком много времени, крича о NSURLCache, поэтому я даю этот совет в надежде, что другие смогут избежать моей неудачи.
Все началось достаточно разумно. Мой новый проект приложения предназначен только для iOS 5 и выше, поэтому я подумал, что смогу воспользоваться новой реализацией NSURLCache для всех своих потребностей в веб-кэшировании. Мне нужен был собственный подкласс NSURLCache для выполнения нескольких специальных задач, но все это, казалось, поддерживалось API. Быстрое чтение документации, и я отправляюсь в гонки:
[NSURLCache setSharedURLCache:[[MyCustomCache alloc] initWithMemoryCapacity:8 * 1024 * 1024 //8mb
diskCapacity:32 * 1024 * 1024 // 32mb
diskPath:@"webcache.db"]];
Я полагаю, что 8-мегабайтный кеш подойдет для начала, и я подкреплю его дисковым кешем большего размера, чтобы мы могли обслуживать больше наших больших изображений локально. Я подключаю остальную часть своего сетевого кода для использования NSURLConnection (на самом деле я использовал MKNetworkKit, но это оказалось неуместным), и ожидайте многого от моего тайника. Разумеется, все запросы, которые должны быть кэшированы, должным образом сохраняются в кеше, а ответы должным образом быстро возвращаются обратно, когда они обслуживаются из кеша. Это обычная постановка «Пиратов Пензанса», и в моем сетевом стеке так много обязанностей.
Только что-то не сходится. Запросы, которые могут быть обслужены из кэша, по-прежнему отправляются по сети. За исключением случаев, когда это не так. Кажется, что кеш действительно используется для обслуживания запроса, и это кажется совершенно случайным и прерывистым. Я в отчаянии рву на себе волосы и копаюсь буквально во всем, пытаясь понять, что происходит. Я создаю тестовые приложения, повсюду устанавливаю точки останова, разрываю трассировку пакетов, читаю каждое слово в Интернете, в котором упоминается NSURLCache, экспериментирую с заголовками управления кешем, комментирую код, обхожу свой подкласс и даже прибегаю к кропотливой трассировке через сборка для NSURLCache и его друзей из CFNetworking, чтобы попытаться понять, какая загадочная логика скрывается за ними. Я значительно улучшил свои знания о соглашениях о вызовах ARM и Objective-C и немного узнаю о низкоуровневой отладке, но на самом деле ничего не понимаю в том, что происходит. Все это больше похоже на Песню кошмаров Иоланты, чем на мягкую диктатуру Короля пиратов и меня практически на грани того, чтобы все бросить.
Версия TL/DR: кажется, что NSURLCache работает, но случайным образом не возвращает кэшированные результаты, даже если они доступны.
+[NSURLCache sharedURLCache]
проверяется перед проверкой кеша Safari на уровне ОС. Однако ответ не будет кэшироваться в общем кеше вашего приложения, и кто знает, как ведет себя кеш уровня ОС. - person goldierox   schedule 15.08.2012