2013-03-29 1 views
13

Ich hoffe, dass jemand etwas Licht auf ein paar Dinge, die ich erforscht habe, aber nicht viel Fortschritte auf etwas beleuchten kann.Wie NSURLCache verwenden, um zwischengespeicherte API-Antworten zurückzugeben, wenn offline (iOS App)

Ich möchte NSURLCache nutzen, um zwischengespeicherte Antworten für API-Aufrufe zurückzugeben, die ich innerhalb einer iOS App mache. Wenn das Gerät online ist, möchte ich die zwischengespeicherte Antwort zurückgeben, wenn es gerade neu genug ist, andernfalls von der Fernbedienung abrufen. Wenn das Gerät offline ist, möchte ich die zwischengespeicherte Antwort (falls vorhanden) sofort zurückgeben, unabhängig vom Alter.

Ich benutze AFNetworking. Die API-Aufrufe, die ich mache, sind auf einem Server, den ich kontrolliere. Protokoll ist HTTPS. Der Antwortkopf Cache-Control ist derzeit "max-age=0, public". Ich setze derzeit keine cache-bezogenen Anfrage-Header (sollte ich?). Ich habe die Cache-Richtlinie der Anfrage auf NSURLRequestReturnCacheDataDontLoad gesetzt, wenn sie offline ist, und verwende die Standardeinstellung NSURLRequestUseProtocolCachePolicy, wenn sie online ist. Und ich kann die Anfragen und ihre Antworten in der Standardeinstellung Cache.db auf der Festplatte sehen. Allerdings, wenn ich offline alle Anfragen scheitern (keine cached Antworten (trotz erscheinen zu zwischengespeichert wurde) verwendet werden/zurückgegeben

Per http://nshipster.com/nsurlcache/ ich ein sharedURLCache in didFinishLaunchingWithOptions initialisieren und stellen Sie den AFNetworking setCacheResponse Block zu so etwas wie diese.:

 
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]; 

ich habe diese und andere Beiträge zum Thema lesen:

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

Ich frage mich, ob jemand diese Funktionalität vor der Verwendung des Standards NSURLCache erfolgreich erreicht hat (auch interessiert an Erfolgsgeschichten mit SDURLCache, aber Peter S. sagt, dass ab iOS5 Disk-Caching unterstützt wird SDURLCache wird nicht mehr benötigt, dh ich ' möchte den standardmäßig eingebauten Cache verwenden).

Vielen Dank im Voraus!

+0

Es erscheint der 7. in iOS wurde behoben gibt es eine offizielle Zusammenarbeit Bestätigung von Apple, dass dieser Fehler behoben wurde? – hpique

Antwort

2

Haben Sie diesen Beitrag gesehen?

AFNetworking (AFHttpClient) offline mode not working with NSURLRequestReturnCacheDataDontLoad policy

Sieht aus wie es ein Fehler mit iOS sein könnte 6. Hier ist, was Robert Mao in der Post zu sagen hatte:

A zusammengefasst Arbeit um lesen aus dem Cache die Antwort ist, statt von NSURLRequestReturnCacheDataDontLoad Politik Nutzung:

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

Verlinkung zu allen Artikeln zu dieser Antwort: [one] (http://stackoverflow.com/questions/14002422/afnetworking-afhttpclient-offline-mode-not-working-with-nsurlrequestreturncach), [two] (https://github.com/AFNetworking/AFNetworking/issues/378), [drei] (https: // github.com/AFNetworking/AFNetworking/issues/566) –

+0

Vielen Dank Del, das ist genau das, was ich gesucht habe. –

+0

Gern geschehen. Nette Idee, andere verwandte Verbindungen hinzuzufügen. –

-4

Es sei denn, alle Ihre Anrufe sind 100% GET und frei von Nebenwirkungen oder Zeitabhängigkeit, dann ist dies gefährlich.

+9

Dies ist wahrscheinlich eher ein Kommentar als eine Antwort. Schätzen Sie Ihre Eingaben, aber es gibt einige ernsthafte Diskussionen zu diesem Thema, da es sich um einen legitimen Anwendungsfall handelt und NSURLCache zum Teil dafür ausgelegt ist. –

Verwandte Themen