AFNetworking - do not cache response
Asked Answered
B

8

17

I'm using this code to pull a simple JSON feed from a server:

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

It works. However, after I change the JSON file at kDataUrl, and verify that the change is made in a browser, when I run the app again, I still get the previous response.

It seems that AFNetworking is somehow caching the old response. I do not want this behavior. I want to download the current feed. Is there some kind of setting or parameter I need to set to turn off caching?

Bowes answered 23/11, 2013 at 18:26 Comment(3)
did you solve this? I can't find something to set cache policy in AFHTTPRequestOperationManagerInterpretive
I cover caching in AFNetworking in this blog post - AFImageCache & NSURLCache. Maybe you will find it use flu : blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcacheAppetizing
try like this: #33768408Terranceterrane
W
61

Make long story short, just define your AFNetworking manager:

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

Enjoy!

Watch answered 12/5, 2014 at 8:56 Comment(2)
There is no such method named setCachePolicy for AFNetworking. Could you please make it more clear?Allium
With the new AFNetworking library versions you can set this to url session configuration object. NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;Octillion
E
12

What you are experiencing is the effect of the URL cache (see NSURLCache).

The caching behavior of the request can be defined by setting a "Cache Policy" for the NSMutableURLRequest object, e.g.:

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

The default caching behavior (NSURLRequestUseProtocolCachePolicy) is appropriate for the current protocol, which is HTTP. And for the HTTP protocol, a GET requests will be cached by default!

And, AFNetworking does not change the default behavior of the request!

Now, you could set another cache policy, for example:

NSURLRequestReloadIgnoringLocalCacheData

Specifies that the data for the URL load should be loaded from the originating source. No existing cache data should be used to satisfy a URL load request.

This is likely the desired behavior you want to achieve:

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];

The problem here is, that the super "convenient" API does not provide a way to configure the URL cache behavior of the request. You cannot access the used request at all.

Thus, I would suggest to use a lower level API where you have control about the created NSMutableURLRequest object, and set the cache policy accordingly.

Empanel answered 23/11, 2013 at 19:17 Comment(0)
R
1

Just do:

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad
Redan answered 19/2, 2016 at 16:27 Comment(0)
T
1

For Swift poeple

let manager = AFHTTPSessionManager()
manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
Tijuanatike answered 27/2, 2016 at 0:45 Comment(0)
P
1

With AFNetworking 3:

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

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL
                                                         sessionConfiguration:sessionConfiguration];
Polygynous answered 22/6, 2016 at 12:5 Comment(0)
L
1

try to add some rubbish at the end of your URL (for example, timestamp)

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

In this case, you would request fresh data every time. That works for me))

Leaguer answered 2/2, 2017 at 17:5 Comment(0)
N
1
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

Adding the Cache-Control:no-store header to the request, assuming your server is implemented correctly, will return a response with the same header thus disabling NSURLCache disk cache for any request that contains this header.

Nickname answered 14/8, 2017 at 21:12 Comment(0)
B
0

I don't feel good about it, but here is what works. In the AppDelegate didFinishLaunchingWithOptions:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                            diskCapacity:0
                                                                diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
Bowes answered 23/11, 2013 at 20:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.