Ich versuche, NSURLSessionDownloadTask
zu verwenden, und nutzen Sie die integrierte URL-Caching-Funktion von Apple. Ich habe in immer das Caching gelungen, zu arbeiten, wenn ein NSURLSessionDataTask
mit dem Code unter Verwendung von:Kann ich HTTP-Caching mit einer NSURLSessionDownloadTask auf iOS verwenden?
- (void)downloadUsingNSURLSessionDataTask:(NSURL *)url {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
[dataTask resume];
}
- (void)cachedDataTaskTest {
// This call performs an HTTP request
[self downloadUsingNSURLSessionDataTask:[NSURL URLWithString:@"http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"]];
[NSThread sleepForTimeInterval:1];
// This call returns the locally cached copy, and no HTTP request occurs
[self downloadUsingNSURLSessionDataTask:[NSURL URLWithString:@"http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"]];
}
Ich brauche aber einen Hintergrund Download auszuführen, für die ich eine NSURLDownloadTask verwenden. Wenn ich auf dieses umschalte, tritt das Caching-Verhalten nicht auf.
- (void)downloadUsingNSURLSessionDownloadTask:(NSURL *)url {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request];
[downloadTask resume];
}
- (void)cachedDownloadTaskTest {
// This call performs an HTTP request
[self downloadUsingNSURLSessionDownloadTask:[NSURL URLWithString:@"http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"]];
[NSThread sleepForTimeInterval:1];
// This call also performs an HTTP request
[self downloadUsingNSURLSessionDownloadTask:[NSURL URLWithString:@"http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"]];
}
This documentation von Apple gibt an, dass NSURLDownloadTasks
rufen Sie nicht die URLSession:dataTask:willCacheResponse:completionHandler:
Delegatmethode, so ist es nicht möglich, für Ihre Anwendung in den Cache-Lebenszyklus haken. Meine Vermutung ist, dass dies bedeutet, dass Caching für diese Aufgaben einfach nicht verfügbar ist, aber es ist nicht explizit darüber.
- Für eine Daten Aufgabe, das
NSURLSession
Objekt ruft dieURLSession:dataTask:willCacheResponse:completionHandler:
Methode des Delegierten. Ihre App sollte dann entscheiden, ob Caching erlaubt. Wenn Sie diese Methode nicht implementieren, wird standardmäßig die im Konfigurationsobjekt der Sitzung angegebene Caching-Richtlinie verwendet.
Kann jemand diese Vermutung bestätigen, dass NSURLSessionDownloadTasks einfach nicht Caching unterstützen? Ist es möglich, das HTTP-Cache-Verhalten von Apple in einer Hintergrundaufgabe zu nutzen?
Warum möchten Sie 'willCacheResponse' überschreiben? – quellish
Ich möchte 'willCacheResponse' nicht überschreiben, aber ich habe bemerkt, dass Sie es nicht für NSURLDownloadTasks überschreiben können, und vermuten, dass dies darauf hinweist, dass diese Aufgaben Caching überhaupt nicht unterstützen. –