Sono quasi certo che iOS 8.0 ha interrotto la capacità di NSURLSession
di memorizzare nella cache i dati di risposta HTTP. Ho aperto un radar con Apple su questo problema.
Ecco alcuni esempi di codice che ho scritto per dimostrare questo:
NSURLSession *session = [NSURLSession sharedSession];
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
diskCapacity:32 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURL *URL = [NSURL URLWithString:@"http://i.imgur.com/b5pyONe.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL
cachePolicy:NSURLRequestReturnCacheDataElseLoad
timeoutInterval:5];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error occurred");
} else {
NSLog(@"Fetched resource!");
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
request = [NSURLRequest requestWithURL:URL
cachePolicy:NSURLRequestReturnCacheDataDontLoad
timeoutInterval:5];
task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Something bad happened: %@", error);
} else {
NSLog(@"Fetched resource!");
}
}];
[task resume];
Anche creare il proprio NSURLSession
- con una NSURLSessionConfiguration
che ha un NSURLCache
che si crea da soli - non risolverà questo problema. Per ora, se hai bisogno di risposte memorizzate nella cache male, devi usare NSURLConnection
.
fonte
2014-09-22 05:27:21
Ho notato qualcosa di molto simile con NSURLSession. Penso che NSURLConnection stia ancora funzionando correttamente con NSURLCache. –
Ho appena notato lo stesso (con AFNetworking2) con la mia sottoclasse NSURLCache personalizzata (storeCachedResponse: forRequest: viene richiamato, ma cachedResponseForRequest: non viene mai chiamato). –