2013-03-29 17 views
13

Spero che qualcuno possa far luce su alcune cose che ho cercato ma che non ha fatto molti progressi.Come utilizzare NSURLCache per restituire le risposte dell'API memorizzate nella cache quando si è offline (App per iOS)

Mi piacerebbe sfruttare NSURLCache per restituire le risposte memorizzate nella cache per le chiamate API che faccio all'interno di un'app iOS. Quando il dispositivo è online, desidero restituire la risposta memorizzata nella cache se è abbastanza recente, altrimenti preleva da remoto. Quando il dispositivo è offline, desidero restituire immediatamente la risposta memorizzata nella cache (se presente) indipendentemente dall'età.

Sto usando AFNetworking. Le chiamate API che sto facendo sono su un server che controllo. Il protocollo è HTTPS. L'intestazione di risposta Cache-Control è attualmente "max-age=0, public". Al momento non sto impostando le intestazioni delle richieste relative alla cache (dovrei?). Ho impostato il criterio di cache della richiesta su NSURLRequestReturnCacheDataDontLoad quando è offline e utilizzo il valore predefinito NSURLRequestUseProtocolCachePolicy quando online. E posso vedere le richieste e le loro risposte nel default Cache.db su disco. Tuttavia quando Sono offline tutte le richieste non riescono (non risposte cache (nonostante che sembra essere stato memorizzato nella cache) vengono utilizzati/restituito

Per http://nshipster.com/nsurlcache/ ho inizializzare un sharedURLCache in didFinishLaunchingWithOptions e impostare l'AFNetworking setCacheResponse blocco a qualcosa di simile.:

 
NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; 
NSMutableData *mutableData = [[cachedResponse data] mutableCopy]; 
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowed; 
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response] data:mutableData userInfo:mutableUserInfo storagePolicy:storagePolicy]; 

ho letto questi e altri messaggi su tema:

http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/ http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html

Mi chiedo se qualcuno là fuori ha raggiunto con successo questa funzionalità prima di utilizzare lo standard NSURLCache (interessato anche a casi di successo che coinvolgono SDURLCache ma Peter S. dice che la cache del disco iOS5 è supportata quindi SDURLCache non è più necessario, cioè I ' mi piace usare la cache integrata predefinita).

Grazie in anticipo!

+0

appare questo è stato fissato in iOS 7. c'è qualche co ufficiale conferma da Apple che questo bug è stato risolto? – hpique

risposta

2

Hai visto questo post?

AFNetworking (AFHttpClient) offline mode not working with NSURLRequestReturnCacheDataDontLoad policy

sembra che potrebbe essere un bug con iOS 6. Ecco quello che Robert Mao aveva da dire nel post:

Un'opera sintetizzato intorno è leggere la risposta dalla cache, invece di utilizzo politica NSURLRequestReturnCacheDataDontLoad:

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

Collegamento a tutti gli articoli correlati a questa risposta: [uno] (http://stackoverflow.com/questions/14002422/afnetworking-afhttpclient-offline-mode-not-working-with-nsurlrequestreturncach), [two] (https://github.com/AFNetworking/AFNetworking/issues/378), [tre] (https: // github.it/AFNetworking/AFNetworking/issues/566) –

+0

Grazie mille Del, questo è esattamente quello che stavo cercando. –

+0

Prego. Bella idea di aggiungere altri collegamenti correlati. –

-4

A meno che tutte le chiamate siano al 100% GET e prive di effetti collaterali o dipendenza dal tempo, questo è pericoloso.

+9

Questo è probabilmente più un commento che una risposta. Apprezzo il tuo contributo, ma ci sono alcune discussioni serie su questo argomento perché è un caso d'uso legittimo e NSURLCache è in parte progettato per gestire questo genere di cose. –

Problemi correlati