SDURLCache с AFNetworking и автономным режимом не работает

Я использую AFNetworkingи SDURLCacheдля всех моих сетевых операций.

У меня SDURLCacheнастроен следующим образом:

SDURLCache *urlCache = [[SDURLCache alloc]
        initWithMemoryCapacity:1024*1024*2   // 2MB mem cache
        diskCapacity:1024*1024*15 // 15MB disk cache
        diskPath:[SDURLCache defaultCachePath]];
    [urlCache setMinCacheInterval:1];
    [NSURLCache setSharedURLCache:urlCache];

Все мои запросы используют cachePolicy NSURLRequestUseProtocolCachePolicy, который, согласно документам Apple, работает следующим образом:

Если NSCachedURLResponse не существует для запроса, то данные извлекаются из исходного источника. Если есть кеш ответ на запрос, система загрузки URL проверяет ответ чтобы определить, указывает ли он, что содержимое должно быть повторно проверено. Если содержимое должно быть повторно проверено, установлено соединение с исходный источник, чтобы увидеть, изменился ли он.Если он не изменился, затем ответ возвращается из локального кеша. Если он изменился, данные извлекаются из исходного источника.

Если в кэшированном ответе не указано, что содержимое должно быть повторно проверено, максимальный возраст или срок действия, указанный в ответе осматривается. Если кешированный ответ достаточно свежий, то ответ возвращается из локального кеша. Если ответ определяется как устаревший, исходный источник проверяется на наличие более новых данные. Если доступны более новые данные, данные извлекаются из исходный источник, в противном случае он возвращается из кэша.

Так что все отлично работает даже в авиарежиме, пока кэш не устарел. Когда срок действия кеша истекает (max-age и другие), вызывается блок отказа.

Я немного покопался внутри SDURLCache, и этот метод возвращает ответ с достоверными данными (я преобразовал данные в строку, и она содержит кэшированную информацию)

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
    request = [SDURLCache canonicalRequestForRequest:request];

    NSCachedURLResponse *memoryResponse =
        [super cachedResponseForRequest:request];
    if (memoryResponse) {
        return memoryResponse;
    }

    NSString *cacheKey = [SDURLCache cacheKeyForURL:request.URL];

    // NOTE: We don't handle expiration here as even staled cache data is
    // necessary for NSURLConnection to handle cache revalidation.
    // Staled cache data is also needed for cachePolicies which force the
    // use of the cache.
    __block NSCachedURLResponse *response = nil;
    dispatch_sync(get_disk_cache_queue(), ^{
        NSMutableDictionary *accesses = [self.diskCacheInfo
            objectForKey:kAFURLCacheInfoAccessesKey];
        // OPTI: Check for cache-hit in in-memory dictionary before to hit FS
        if ([accesses objectForKey:cacheKey]) {
            response = [NSKeyedUnarchiver unarchiveObjectWithFile:
                [_diskCachePath stringByAppendingPathComponent:cacheKey]];
            if (response) {
                // OPTI: Log entry last access time for LRU cache eviction
                // algorithm but don't save the dictionary
                // on disk now in order to save IO and time
                [accesses setObject:[NSDate date] forKey:cacheKey];
                _diskCacheInfoDirty = YES;
            }
        }
    });

    // OPTI: Store the response to memory cache for potential future requests
    if (response) {
        [super storeCachedResponse:response forRequest:request];
    }

    return response;
}

Итак, в В этот момент я понятия не имею, что делать, потому что я считаю, что ответ обрабатывается ОС, а затем AFNetworkingполучает

- (void)connection:(NSURLConnection *)__unused connection 
  didFailWithError:(NSError *)error

внутри AFURLConnectionOperation.

37
задан JOM 18 February 2013 в 05:01
поделиться