Zwischenspeichern mit NSURLSession und NSURLCache. Funktioniert nicht

Ich habe ein Test-App-Setup und es lädt erfolgreich Inhalte aus dem Netzwerk herunter, auch wenn der Benutzer während eines Downloads die App wechselt. Großartig, jetzt habe ich Hintergrund-Downloads. Jetzt möchte ich Caching hinzufügen. Es hat keinen Sinn, dass ich Bilder mehr als einmal herunterlade, b / c des Systemdesigns, wenn ich eine Bild-URL habe, von der ich Ihnen sagen kann, dass sich der Inhalt hinter dieser URL niemals ändern wird. Jetzt möchte ich die Ergebnisse meines Downloads mit dem integrierten In-Memory / On-Disk-Cache von Apple zwischenspeichern, von dem ich so viel gelesen habe (im Gegensatz dazu, dass ich die Datei manuell in NSCachesDirectory speichere und sie dann prüfe, bevor ich sie neu erstelle Anfrage, ick). In einem (nVersuch Um Caching über diesen Arbeitscode zu bringen, habe ich den folgenden Code hinzugefügt:

- (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;
}

Beim Erstellen meiner Sitzung habe ich zwei NEUE Zeilen hinzugefügt (URLCache und 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;
}

Dann habe ich meine NSURLRequest-Leitung umgestellt, um zu versuchen, den Erfolg des Cachings zu sehen, ultra-redundant zu sein

// NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL]; // Old line, I've replaced this with...
NSURLRequest *request = [NSURLRequest requestWithURL:downloadURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:2*60]; // New line

Wenn ich jetzt zum zweiten Mal gehe, um den Artikel herunterzuladen, ist die Erfahrung genau wie die erste !! Das Herunterladen dauert lange und der Fortschrittsbalken wird langsam und stetig wie ein Original-Download animiert. Ich möchte die Daten sofort im Cache haben !! Was vermisse ich???

----------------------------AKTUALISIEREN--------------------- -------

Okay, dank Thorstens Antwort habe ich die folgenden zwei Codezeilen zu meinem hinzugefügtdidFinishDownloadingToURL Delegate-Methode:

- (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
    */
}

Das ist toll. Es bestätigt, dass der Cache wächst. Ich vermute, da ich eine Download-Aufgabe verwende (Herunterladen in eine Datei im Gegensatz zum Speicher), wächst der DiskCache aus diesem Grund und nicht zuerst der Speicher-Cache? Ich dachte, alles würde in den Speicher-Cache verschoben, bis dieser übergelaufen ist und dann der Festplatten-Cache verwendet wird und möglicherweise der Speicher-Cache auf die Festplatte geschrieben wird, bevor das Betriebssystem die App im Hintergrund beendet, um Speicher freizugeben. Verstehe ich falsch, wie der Cache von Apple funktioniert?

Dies ist sicher ein Fortschritt, aber das zweite Mal, wenn ich die Datei herunterladees dauert genauso lange wie beim ersten mal (vielleicht 10 Sekunden oder so) und die folgende Methode wird erneut ausgeführt:

- (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?
}

Was halten Sie von meinen obigen Änderungen? Warum wird die Datei bei späteren Anfragen nicht sehr schnell zurückgegeben?

Wie kann ich bei der zweiten Anforderung überprüfen, ob die Datei aus dem Cache bereitgestellt wird?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage