Cómo almacenar en caché usando NSURLSession y NSURLCache. No funciona

Tengo una configuración de aplicación de prueba y descarga con éxito el contenido de la red, incluso si el usuario cambia de aplicación mientras se realiza una descarga. Genial, ahora tengo descargas en segundo plano. Ahora quiero agregar el almacenamiento en caché. No tiene sentido descargar imágenes más de una vez, b / c del diseño del sistema, dada una URL de imagen, puedo decirle que el contenido detrás de esa URL nunca cambiará. Entonces, ahora quiero almacenar en caché los resultados de mi descarga usando el caché incorporado en la memoria / en disco de Apple sobre el que he leído mucho (en lugar de guardar el archivo manualmente en NSCachesDirectory y luego verificarlo allí antes de hacer un nuevo solicitud, ick). En unintento para que el almacenamiento en caché funcione sobre este código de trabajo, agregué el siguiente código:

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

Cuando creo mi sesión, agregué dos NUEVAS líneas (URLCache y 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;
}

Luego, solo para ser ultra redundante en un intento de ver el éxito del almacenamiento en caché, cambié mi línea 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

Ahora, cuando voy a descargar el artículo por segunda vez, ¡la experiencia es exactamente como la primera! La descarga tarda mucho tiempo y la barra de progreso se anima lenta y constantemente como una descarga original. ¡Quiero los datos en el caché de inmediato! ¿¿¿Qué me estoy perdiendo???

----------------------------ACTUALIZAR--------------------- -------

Bien, gracias a la respuesta de Thorsten, agregué las siguientes dos líneas de código a mididFinishDownloadingToURL método delegado:

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

Esto es genial. Confirma que el caché está creciendo. Supongo que debido a que estoy usando un downloadTask (descargas a un archivo en lugar de memoria), ¿es por eso que DiskCache está creciendo y no la memoria caché primero? Pensé que todo iría a la memoria caché hasta que se desbordara y luego se usaría la memoria caché del disco y tal vez la memoria caché se escribiera en el disco antes de que el sistema operativo elimine la aplicación en segundo plano para liberar memoria. ¿Estoy malinterpretando cómo funciona el caché de Apple?

Este es un paso adelante seguro, pero la segunda vez que descargo el archivotoma tanto tiempo como la primera vez (tal vez 10 segundos más o menos) y el siguiente método se ejecuta nuevamente:

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

¿Qué opinas de mis ediciones anteriores? ¿Por qué no veo el archivo devuelto muy rápidamente en solicitudes posteriores?

¿Cómo puedo confirmar si el archivo se está sirviendo desde la caché en la segunda solicitud?