我正在嘗試使用NSURLSessionDownloadTask
,並利用Apple內置的URL緩存功能。我已經成功地得到了高速緩存使用NSURLSessionDataTask
使用下面的代碼時的工作:我可以在iOS上使用HTTP緩存和NSURLSessionDownloadTask嗎?
- (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"]];
}
不過,我需要執行的,我必須使用NSURLDownloadTask後臺下載。當我切換到這個緩存行爲不會發生。
- (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蘋果表示NSURLDownloadTasks
不叫URLSession:dataTask:willCacheResponse:completionHandler:
委託方法,因此它不可能爲你的應用程序掛接到緩存的生命週期。我的猜測是,這意味着高速緩存對於這些任務根本不可用,但對此沒有明確說明。
- 對於數據任務,所述
NSURLSession
對象調用委託的URLSession:dataTask:willCacheResponse:completionHandler:
方法。然後你的 應用程序應該決定是否允許緩存。如果您不執行此方法,則默認行爲是使用會話的配置對象中指定的緩存 策略。
任何人都可以證實此預感NSURLSessionDownloadTasks根本不支持緩存?是否有可能在後臺任務中利用Apple的HTTP緩存行爲?
你爲什麼要重寫'willCacheResponse'? – quellish 2014-10-10 06:31:51
我不想重寫'willCacheResponse',但我注意到你不能覆蓋它的NSURLDownloadTasks,並且懷疑這表明這些任務根本不支持緩存。 – 2014-10-10 09:15:27