Я просто потратил слишком много времени, крича свою голову в 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, но это оказалось неактуальным), и ожидайте отличных результатов от моего кэш. Разумеется, все запросы, которые должны быть кэшированы, покорно сохраняются в кеше, и ответы добросовестно летают быстро, когда они обслуживаются из кеша. Это регулярное производство Pirates of Penzance с такой большой нагрузкой, что я летаю в своем сетевом стеке.
Кроме того, что не складывается. Запросы, которые могут быть поданы из кеша, по-прежнему выходят из сети. За исключением случаев, когда это не так. Кажется совершенно случайным и прерывистым, действительно ли кеш используется для обслуживания запроса. Я отрываю свои волосы от разочарования и в буквальном смысле слова все стараюсь выяснить, что происходит. Я создаю тестовые приложения, устанавливаю точки останова повсюду, разрываю трассировку пакетов, читаю каждое слово в Интернете, которое упоминает NSURLCache, экспериментирует с заголовками кеш-контроля, комментирует код, обходит мой подкласс и даже прибегает к кропотливой трассировке через сборку для NSURLCache и ее друзей CFNetworking, чтобы попытаться понять, что таинственная логика лежит ниже. Я значительно улучшаю свои знания в области ARM и Objective-C, вызывая соглашения и немного разбираясь в низкоуровневой отладке, но нигде не узнаю, что происходит. Все это гораздо больше похоже на Iolanthe Nightmare Song, чем доброкачественная диктатура Пиратского короля, и я в значительной степени на грани того, чтобы выбросить все это.
Версия TL/DR: NSURLCache работает, но беспорядочно не возвращает кешированные результаты, даже если он доступен.