我有一個測試應用程序設置,即使用戶在下載過程中切換應用程序,它也能成功從網絡下載內容。太棒了,現在我有了背景下載。現在我想添加緩存。我不止一次下載圖像,系統設計的B/C,給出一個圖像的URL我可以告訴你,該網址後面的內容將永遠不會改變。所以,現在我想使用蘋果內置的內置/磁盤緩存來緩存我下載的結果,我已經閱讀了很多內容(與我在NSCachesDirectory中手動保存文件然後在製作新內容之前檢查該文件相反)請求,ick)。在嘗試得到緩存在此工作的代碼頂部的工作,我添加以下代碼:如何使用NSURLSession和NSURLCache進行緩存。不工作
- (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
現在,當我去下載項的第二次,經驗是像第一個一樣的exaclty!需要很長時間才能下載,並且進度條像原始下載一樣緩慢而穩定。我想立即在緩存中的數據!我錯過了什麼?
---------------------------- UPDATE ----------------- -----------
好了,感謝和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?
}
你對我上面的編輯做了什麼?爲什麼我在後續請求中看不到該文件很快返回?
如何確認文件是否從第二個請求的緩存中提供?
我試過使用此代碼來查看一旦從網絡加載至少一次,小縮略圖是否會更快回來。他們沒有進步得更快。我想知道這個緩存是否真的有效。 – zumzum
@zumzum你可以嘗試一個更大的文件,看它是否工作。一個大文件很清楚緩存是否設置正確並正常工作。 –
爲了更精確一點,蘋果公司的'URLSession:dataTask:willCacheResponse:completionHandler:'(https://developer.apple.com/library/prerelease/ios/documentation/Foundation/Reference/NSURLSessionDataDelegate_protocol/index。 html#// apple_ref/occ/intfm/NSURLSessionDataDelegate/URLSession:dataTask:willCacheResponse:completionHandler :)明確指出NSURLSession不會嘗試緩存大於緩存大小5%的文件 – jcaron