2013-11-23 22 views
17

sto usando questo codice per tirare una semplice alimentazione JSON da un server:AFNetworking - non memorizza nella cache risposta

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

[manager GET:kDataUrl parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"response: %@", responseObject); 
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"JSON DataError: %@", error); 
    }]; 

Funziona. Tuttavia, dopo aver modificato il file JSON su kDataUrl e verificato che la modifica venga apportata in un browser, quando eseguo nuovamente l'app, ottengo comunque la risposta precedente.

Sembra che AFNetworking stia in qualche modo memorizzando nella cache la vecchia risposta. Non voglio questo comportamento. Voglio scaricare il feed corrente. C'è qualche tipo di impostazione o parametro che devo impostare per disattivare la memorizzazione nella cache?

+0

hai risolto questo? Non riesco a trovare qualcosa per impostare la politica della cache in AFHTTPRequestOperationManager – laucel

+0

I cover caching in AFNetworking in questo post del blog - AFImageCache e NSURLCache. Forse lo troverai utilizza l'influenza: http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/ – vfxdrummer

+0

prova in questo modo: http://stackoverflow.com/questions/33767908/ volunteermatch-api-objective-c/33886449 # 33886449 – Vvk

risposta

55

fare per farla breve, basta definire il responsabile AFNetworking:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

Enjoy!

+1

Non esiste un tale metodo denominato setCachePolicy per AFNetworking. Potresti per favore renderlo più chiaro? –

+2

In realtà, c'è e questa soluzione funziona. – OhadM

+2

Con le nuove versioni della libreria AFNetworking è possibile impostarlo sull'oggetto di configurazione della sessione url. 'NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; ' – dishan

12

Quello che si verifica è l'effetto della cache dell'URL (vedere NSURLCache).

Il comportamento della cache della richiesta può essere definito impostando un "Policy Cache" per l'oggetto NSMutableURLRequest, ad esempio:

NSMutableURLRequest* request = ...; 
[request setCachePolicy: myCachePolicy]; 

Il comportamento predefinito di cache (NSURLRequestUseProtocolCachePolicy) è appropriato per l'attuale protocollo, che è HTTP. E per il protocollo HTTP, le richieste GET verranno memorizzate nella cache per impostazione predefinita!

E, AFNetworking non modifica il comportamento predefinito della richiesta!

Ora, è possibile impostare un altro criterio di cache, ad esempio:

NSURLRequestReloadIgnoringLocalCacheData

Specifica che i dati per il carico URL devono essere caricati dalla fonte originaria. Non è necessario utilizzare i dati della cache esistenti per soddisfare una richiesta di caricamento dell'URL.

Questo è probabilmente il comportamento desiderato che si vuole raggiungere:

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData]; 

Il problema qui è che il super-API "comodo" non fornisce un modo per configurare il comportamento della cache URL della richiesta . Non è possibile accedere alla richiesta utilizzata.

Pertanto, suggerirei di utilizzare un'API di livello inferiore in cui si ha il controllo sull'oggetto NSMutableURLRequest creato e impostare di conseguenza la politica della cache.

0

Non mi sento bene, ma ecco cosa funziona. Nella AppDelegate didFinishLaunchingWithOptions:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 
                  diskCapacity:0 
                   diskPath:nil]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
1

Basta fare:

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad 
0

Per poeple Swift

let manager = AFHTTPSessionManager() 
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 
0

Con AFNetworking 3:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL 
                 sessionConfiguration:sessionConfiguration]; 
1

tenta di aggiungere un po 'di rifiuti alla fine del tuo URL (ad esempio, timestamp)

kDataUrl = [NSString stringWithFormat:@"%@?%f", kDataUrl, [NSDate timeIntervalSinceReferenceDate]]; 

In questo caso, richiederei sempre nuovi dati. che funziona per me))

0
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; 
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

Aggiunta l'intestazione Cache-Control:no-store alla richiesta, supponendo che il server è implementato correttamente, ritornerà una risposta con la stessa intestazione disabilitando così NSURLCache cache del disco per qualsiasi richiesta che contiene questa intestazione.

Problemi correlati