Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How To Disable AFNetworking Cache

Is it possible to disable all the cache features from AFNetworking?

I am building my own custom cache system and don't want this to take up disk space too.

Thanks, Ashley

like image 975
Ashley Staggs Avatar asked Apr 01 '12 20:04

Ashley Staggs


4 Answers

Cacheing is handled application-wide by NSURLCache. If you don't set a shared cache, requests are not cached. Even with a shared NSURLCache, the default implementation on iOS does not support disk cacheing anyway.

That said, unless you have a very particular reason to write your own cacheing system, I would strongly recommend against it. NSURLCache is good enough for 99.9% of applications: it handles cache directives from incoming responses and uses them appropriately with new requests, and does so automatically in a way that is unlikely to be a performance bottleneck in your application. As someone who has wasted untold hours making one myself (and later throwing it away since it was completely unnecessary), I'd say that there are much better places to focus your development attention.

like image 187
mattt Avatar answered Nov 20 '22 13:11

mattt


Initially I found Jason Moore's answer to work, however recently I have noticed my app is still caching requests. I am not using the latest AFNetworking, so I do not know if caching has been addressed in more recent builds.

Apple's URLCache Project has this to say:

By default, the Cocoa URL loading system uses a small shared memory cache. We don't need this cache, so we set it to zero when the application launches.

And then does this to disable the cache.

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

This will disable all caching for your whole app, which may not be ideal in some situations, but as NSURLRequest is not honouring the requested cache policy, it is the only option left that I can see.

like image 38
addicted2oxygen Avatar answered Nov 20 '22 12:11

addicted2oxygen


I've found on iOS 6 that requests are sometimes cached, even if the request has NSURLRequestReloadIgnoringCacheData. Adding a cache response block that returns nil prevents the request from being cached.

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
                                              cachePolicy:NSURLRequestReloadIgnoringCacheData
                                          timeoutInterval:20];
AFJSONRequestOperation *op =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request];

// DISABLE CACHE //
[op setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
    return nil;
}];

[op start];
like image 23
Jason Moore Avatar answered Nov 20 '22 13:11

Jason Moore


Unfortunately non of these methods worked for me. The only way I've managed to get the cache disabled is this way:

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

Here's the original answer

like image 10
JakubKnejzlik Avatar answered Nov 20 '22 11:11

JakubKnejzlik