Good article here about the problem:
http://andrewmarinov.com/ioss-corenetwork-lying/
Basically, from the NSHTTPURLResponse the status code is always 200
So if you really need to know, you can check the item is in the cache before you make the request
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
NSHTTPURLResponse *httpCacheResponse = (NSHTTPURLResponse *)cachedResponse.response;
If so save the modified 'etag' or 'modified-date' header
NSString* etag = httpCacheResponse.allHeaderFields[@"etag"];
Then, in the response handler check the etag or modified-date is the same. If so, the response was from the cache!