Автономный режим AFNetworking (AFHttpClient) не работает с политикой NSURLRequestReturnCacheDataDontLoad

Я использую AFNetworking в своем приложении и пытаюсь заставить его работать в автономном режиме, используя кэшированные данные, если они доступны.

Я ожидал, что после того, как я установил политику кэширования запросов на NSURLRequestReturnCacheDataDontLoad, getPath:parameters:success:failure: будет успешно работать с кэшированными данными в автономном режиме. Однако, даже если в кеше есть данные (я проверял, проверяя кеш с кодом), getPath просто не получится в авиарежиме.

В github AFNetworking была ветка: https://github.com/AFNetworking/AFNetworking/issues/378 Но казалось, что проблема вообще не решена. Автор AFNetworking просто указывает на документ Apple, и в нем говорилось:

NSURLRequestReturnCacheDataDontLoad Указывает, что существующие данные кэша должны использоваться для удовлетворения запроса, независимо от его возраста или даты истечения срока действия. Если в кэше нет существующих данных, соответствующих запросу на загрузку URL-адреса, не предпринимается никаких попыток загрузить данные из исходного источника, и загрузка считается неудачной. Эта константа определяет поведение, аналогичное «автономному» режиму.

Как заявила Apple, NSURLRequestReturnCacheDataDontLoad как раз и предназначен для автономного режима.

Я тестирую в iOS6, я тестировал как NSURLCache, так и SDURLCache, все они имеют одинаковый результат.

Запрос не выполнен, сообщение об ошибке:

22-12-2012 03:11:18.988 Ошибка Testapp[43692:907]: Домен ошибки=NSURLErrorDomain Code=-1009 «Подключение к Интернету отключено». UserInfo=0x211b87c0 {NSErrorFailingURLStringKey=http://Testapp.com/api/v1/photo/latest/, NSErrorFailingURLKey=http://Testapp.com/api/v1/photo/latest/, NSLocalizedDescription=Интернет-соединение offline., NSUunderlyingError=0x211b9720 "Подключение к Интернету отключено."}


person Robert Mao    schedule 22.12.2012    source источник


Ответы (1)


Выяснилось, что это баг iOS 6.

В AFNetworking есть дискуссионная ветка именно по этой проблеме: https://github.com/AFNetworking/AFNetworking/issues/566

Спасибо гайкогусу за советы и эксперименты по этому вопросу. Я потратил ночь на этот вопрос!

Обобщенный обходной путь — чтение ответа из кеша вместо использования политики NSURLRequestReturnCacheDataDontLoad:

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
if (cachedResponse != nil &&
    [[cachedResponse data] length] > 0)
{
    // Get cached data
    ....
}
person Robert Mao    schedule 22.12.2012