Sto implementando un'app che esegue molte chiamate di rete verso un sistema di riposizionamento controllato da noi. Recentemente abbiamo deciso di introdurre le intestazioni di cache sul lato server per salvare alcune preziose reti e tempo del server. Dato che non sappiamo in anticipo per quanto tempo i dati saranno validi, non stiamo inviando intestazioni Cache-control: max-age
o Expires
, tutto ciò che facciamo è inviare un'intestazione Last-Modified
insieme a un E-tag
, quindi colpiamo sempre il server ma le risposte sono piuttosto veloci la maggior parte di i tempi con un 304
. All'inizio sembrava tutto a posto, con molte richieste in cache. Tuttavia, si verificano alcuni errori di dati casuali sull'app a causa della memorizzazione nella cache.NSURLCache che memorizza nella cache le risposte casuali che non devono essere memorizzate nella cache
Per qualche motivo non riesco a capire, a alcune richieste punto vengono localmente nella cache e utilizzati come dati "aggiornati", senza colpire il server, quando in realtà non lo sono. Il problema rimane lì fino a quando passa un po 'di tempo. Quindi tutto torna normalmente al server, esattamente come si comporterebbe con un'intestazione cache-control
, ma senza di essa !. Quindi, la mia domanda è:
Come può NSURLCache
insieme NSURLConnection
decidere che una determinata richiesta non ha bisogno di andare online quando la richiesta originale non è venuto con Cache-control: max-age
o Expires
intestazioni? Qualcuno ha avuto effetti simili? E come posso risolverlo senza rimuovere l'intera cache?
Alcuni più di fondo informazioni:
- Sto usando AFNetworking, ma si basa su
NSURLConnection
quindi non pensano cambia nulla - La cache utilizzata è l'impostazione predefinita
[NSURLCache sharedURLCache]
esempio È una richiesta
GET
e quando controllo le intestazioni dalla risposta memorizzata nella cache questo è ciò che ottengo:po [response allHeaderFields]
"Access-Control-Allow-Headers" = "Content-Type"; "Access-Control-Allow-Methods" = "GET, POST, DELETE, PUT"; "Access-Control-Allow-Origin" = "*"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Length" = 522; "Content-Type" = "application/json"; Date = "Mon, 02 Sep 2013 08:00:38 GMT"; Etag = "\"044ad6e73ccd45b37adbe1b766e6cd50c\""; "Last-Modified" = "Sat, 31 Aug 2013 10:36:06 GMT"; Server = "nginx/1.2.1"; "Set-Cookie" = "JSESSIONID=893A59B6FEFA51566023C14E3B50EE1E; Path=/rest-api/; HttpOnly";
Non posso prevedere o riprodurre quando l'errore sta per accadere così soluzioni che si basano sulla cancellazione della cache non sono un'opzione.
- Sto usando iOS5 +
No possibilità che ci sia un problema di sincronizzazione dell'orologio tra il dispositivo e il server? Le specifiche dicono che il comportamento del client non è definito in quel caso (fino al cliente per fare ciò che è appropriato). Hai anche provato a utilizzare un codice di rete per ottenere ulteriori informazioni? – Alex
il problema del tempo è stato il mio primo pensiero ma non sono riuscito a trovare uno scenario ripetibile (accade in modo casuale). Comunque, è successo sui dispositivi con tempo e lato server corretti, quindi non sembra essere così :(grazie per il suggerimento! –