NSURLCache дает противоречивые результаты на iOS5, по-видимому, случайным образом

Я только что провел слишком много времени, крича о 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 работает, но случайным образом не возвращает кэшированные результаты, даже если они доступны.

11
задан Zach Lipton 16 July 2012 в 03:57
поделиться