我有一个测试应用程序设置,即使用户在下载过程中切换应用程序,它也会成功地从网络下载内容。太好了,现在我有后台下载。现在我想添加缓存。我没有必要多次下载图像,系统设计的 b/c,给定一个图像 URL,我可以告诉你该 URL 背后的内容永远不会改变。所以,现在我想使用我读过很多的苹果内置的内存/磁盘缓存来缓存我的下载结果(而不是我在 NSCachesDirectory 中手动保存文件,然后在制作新文件之前检查那里请求,ick)。为了让缓存在这个工作代码之上工作,我添加了以下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// Set app-wide shared cache (first number is megabyte value)
[NSURLCache setSharedURLCache:[[NSURLCache alloc] initWithMemoryCapacity:60 * 1024 * 1024
diskCapacity:200 * 1024 * 1024
diskPath:nil]];
return YES;
}
创建会话时,我添加了两条新行(URLCache 和 requestCachePolicy)。
// Helper method to get a single session object
- (NSURLSession *)backgroundSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.example.apple-samplecode.SimpleBackgroundTransfer.BackgroundSession"];
configuration.URLCache = [NSURLCache sharedURLCache]; // NEW LINE ON TOP OF OTHERWISE WORKING CODE
configuration.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad; // NEW LINE ON TOP OF OTHERWISE WORKING CODE
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
然后,只是为了超级冗余以尝试查看缓存成功,我将 NSURLRequest 行从
// NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL]; // Old line, I've replaced this with...
NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:2*60]; // New line
现在,当我第二次去下载该项目时,体验和第一次一样!下载需要很长时间,进度条的动画缓慢而稳定,就像原始下载一样。我要立即缓存中的数据!!我错过了什么???
- - - - - - - - - - - - - - 更新 - - - - - - - - - - - --------
好的,感谢 Thorsten 的回答,我在didFinishDownloadingToURL
委托方法中添加了以下两行代码:
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL {
// Added these lines...
NSLog(@"DiskCache: %@ of %@", @([[NSURLCache sharedURLCache] currentDiskUsage]), @([[NSURLCache sharedURLCache] diskCapacity]));
NSLog(@"MemoryCache: %@ of %@", @([[NSURLCache sharedURLCache] currentMemoryUsage]), @([[NSURLCache sharedURLCache] memoryCapacity]));
/*
OUTPUTS:
DiskCache: 4096 of 209715200
MemoryCache: 0 of 62914560
*/
}
这很棒。它确认缓存正在增长。我想因为我使用的是 downloadTask(下载到文件而不是内存),这就是为什么 DiskCache 正在增长而不是内存缓存首先?我认为所有内容都会进入内存缓存,直到溢出,然后将使用磁盘缓存,并且可能在操作系统在后台杀死应用程序以释放内存之前将内存缓存写入磁盘。我是否误解了 Apple 的缓存是如何工作的?
这肯定是向前迈进了一步,但是我第二次下载文件所需的时间与第一次一样长(可能是 10 秒左右),并且以下方法会再次执行:
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
// This shouldn't execute the second time around should it? Even if this is supposed to get executed a second time around then shouldn't it be lightning fast? It's not.
// On all subsequent requests, it slowly iterates through the downloading of the content just as slow as the first time. No caching is apparent. What am I missing?
}
你对我上面的编辑有什么看法?为什么在后续请求中我没有看到文件很快返回?
如何确认文件是否在第二次请求时从缓存中提供?