Sto utilizzando AFNetworking
e SDURLCache
per tutte le operazioni di rete.SDURLCache con AFNetworking e modalità offline non funzionante
ho SDURLCache
insieme in questo modo:
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];
Tutta la mia richiesta utilizza cachePolicy NSURLRequestUseProtocolCachePolicy
, che secondo la documentazione di Apple funziona così:
Se un NSCachedURLResponse non esiste per la richiesta , quindi i dati vengono recuperati dalla fonte di origine. Se esiste una risposta memorizzata nella cache per la richiesta, il sistema di caricamento degli URL controlla la risposta per determinare se specifica che il contenuto deve essere riconvalidato. Se il contenuto deve essere riconvalidato, viene effettuata una connessione alla sorgente di origine per vedere se è stata modificata. Se non è stato modificato, , la risposta viene restituita dalla cache locale. Se è stato modificato, i dati vengono recuperati dalla fonte di origine.
Se la risposta memorizzata nella cache non specifica che il contenuto deve essere riconvalidato, viene esaminata l'età massima o la scadenza specificata nella risposta . Se la risposta memorizzata nella cache è abbastanza recente, la risposta viene restituita dalla cache locale. Se la risposta è determinata per essere aggiornata, la fonte di origine viene verificata per i nuovi dati . Se sono disponibili dati più recenti, i dati vengono recuperati dall'origine di origine , altrimenti viene restituito dalla cache.
Quindi tutto funziona perfettamente anche in modalità aereo purché la cache non sia obsoleta. Quando la cache scade (max-age e altri), viene chiamato il blocco degli errori.
ho scavato un po 'all'interno della SDURLCache
e questo metodo restituisce una risposta con dati validi (ho analizzato i dati in una stringa e contiene le informazioni memorizzate nella cache)
- (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;
}
Quindi a questo punto ho idea di cosa fare, perché credo che la risposta è gestito dal sistema operativo e poi AFNetworking
riceve una
- (void)connection:(NSURLConnection *)__unused connection
didFailWithError:(NSError *)error
all'interno AFURLConnectionOperation
.
Sto affrontando esattamente lo stesso problema in questo momento. Hai trovato una soluzione? – mkto
No, ho fatto una soluzione pazzesca, niente di cui essere orgoglioso :-( – Ecarrion
ho inviato una mail all'autore Pete che ha forgiato SDURLCache spero che abbia una risposta .. – mkto