Auf dem iPhone führe ich eine HTTP-Anforderung mit NSURLRequest für einen Datenblock aus. Objektzuordnungsspitzen und ich ordne die Daten entsprechend zu. Wenn ich mit den Daten fertig bin, gebe ich sie entsprechend frei - Instrumente zeigen jedoch keine Daten an, die freigegeben wurden!
Meine Theorie ist jedoch, dass HTTP-Anforderungen standardmäßig zwischengespeichert werden. Ich möchte nicht, dass meine iPhone-App diese Daten zwischenspeichert.
Gibt es eine Möglichkeit, diesen Cache nach einer Anforderung zu löschen oder zu verhindern, dass Daten überhaupt zwischengespeichert werden?
Ich habe versucht, alle Cache-Richtlinien zu verwenden, die wie folgt dokumentiert sind:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
aber nichts scheint die Erinnerung freizugeben!
cocoa-touch
caching
Nick Cartwright
quelle
quelle
Antworten:
Normalerweise ist es einfacher, die Anfrage so zu erstellen
Dann stellen Sie die Verbindung her
und implementieren Sie die Methode connection: willCacheResponse: auf dem Delegaten. Nur Null zurückzugeben sollte es tun.
quelle
NSURLRequestReloadIgnoringCacheData
und umzusetzenconnection:willCacheResponse:
?connection:willCacheResponse:
können Sie die Antwort nicht im Cache speichern.NSURLRequestReloadIgnoringCacheData
Gibt an, dass die Verbindung die Anforderung laden soll, ohne den Cache zu überprüfen. Ersteres hilft vermutlich bei der Verwaltung der Speicherzuordnung.Ich habe das gleiche Problem in meiner App, als ich Informationen von Twitter angefordert habe. In meinem Fall musste ich diese Anmeldeinformationen nicht beibehalten, daher lösche ich sie einfach mit dem nächsten Code:
Ich hoffe es funktioniert für jemanden :)
quelle
Wenn Sie NSURLConnection verwenden, sehen Sie sich den Delegaten an:
Rückgabewert
Die tatsächlich zwischengespeicherte Antwort, die im Cache gespeichert werden soll. Der Delegat kann cachedResponse unverändert zurückgeben, eine geänderte zwischengespeicherte Antwort zurückgeben oder nil zurückgeben, wenn für die Verbindung keine zwischengespeicherte Antwort gespeichert werden soll.
quelle
Wenn Sie verwenden
NSURLSession
, besteht eine andere Lösung, um zu verhindern, dass Anforderungen und Parameter in dasCache.db
iOS-Caches
Verzeichnis geschrieben werden, darin,NSURLCache
die Konfiguration für die Sitzung auf einen Speicher der Größe 0 und einen Festplatten-Cache der Größe 0 festzulegen, zoder wie oben erwähnt auf globaler Cache-Ebene festgelegt
Vermutlich ist es die 0 für die Festplattengröße, die das Schreiben von iOS auf die Festplatte stoppt. Wenn Sie jedoch eine Richtlinie dazu haben, sind
reloadIgnoringLocalCacheData
Sie wahrscheinlich auch nicht an Speicher-Caching interessiert.Hinweis Dadurch wird verhindert, dass überhaupt
Caches/Cache.db
(Anforderungen und Antworten) oderCaches/fsCachedData/
Ordner (Antwortdaten) erstellt werden. Wir haben uns aus Sicherheitsgründen für diesen Ansatz in einer App entschieden, da wir nicht möchten, dass unsere Anforderungen jemals im Festplatten-Cache gespeichert werden.Wenn jemand weiß, dass es eine Möglichkeit gibt, nur das Zwischenspeichern von Anforderungen zu stoppen, aber das Zwischenspeichern von Antwortdaten über den Mechanismus zum Laden von iOS-URLs beizubehalten, würde mich das interessieren. (Es gibt keine API oder offizielle Dokumentation dazu, soweit ich das beurteilen kann)
quelle
Wenn dies nicht spezifisch für eine einzelne Anforderung ist (Sie möchten den Cache für die gesamte App deaktivieren), ist eine Option die beste. Fügen Sie diesen Code in den App-Delegaten ein oder basierend auf Ihren Anforderungen
quelle
Unter der Annahme, dass der Server korrekt implementiert ist,
Cache-Control:no-store
generiert das Einfügen des Headers in die Anforderung eine Serverantwort mit demselben Header, wodurchNSURLCache
die Antwortdaten nicht auf der Festplatte gespeichert werden.Daher ist der Shotgun-Ansatz zum Deaktivieren des
NSURLCache
Festplatten-Caching nicht erforderlich .PS: Das Hinzufügen des Headers sollte für alle HTTP-Frameworks funktionieren, wie z
AFNetworking
quelle