Pregunta NSURLCache devuelve nil cuando intenta acceder a la solicitud en caché desde el disco


Intento utilizar el url cacing basado en disco incorporado en iOS 5. Tengo un json feed que quiero cargar y luego almacenar en caché, por lo que se carga instantáneamente la próxima vez que un usuario use la aplicación. El archivo cache.db se crea con éxito y si lo abro en un editor sqlite puedo buscar los datos.

Estoy usando AFNetworking

NSURL *url = [NSURL URLWithString:@"http://myurl.com/json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

NSLog(@"%d before call",[[NSURLCache sharedURLCache] currentDiskUsage]);  // logs 0 bytes
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
// is successfully loading JSON and reading it to a table view in a view
}failure:nil];

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request] 
// this returns nil, and can't load the request from disk.

En el bloque de respuesta de la memoria caché, curiosamente la memoria caché ahora está funcionando, y obtiene con éxito la solicitud de cacheurl de la memoria.

[operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
        NSCachedURLResponse *cachedResponse_ = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
        NSLog(@"%d AFTER CACHE",[[NSURLCache sharedURLCache] currentDiskUsage]);
        // this writes out 61440
        return cachedResponse;
    }];

¿Cómo puedo cargar la solicitud de URL en caché desde el disco la próxima vez que inicie la aplicación?


6
2017-11-09 09:44


origen


Respuestas:


Cuando intenta recuperar la respuesta en caché en su primera sección de código (línea 9), la solicitud aún no se ha completado.

-[AFJSONRequestOperation JSONRequestOperationWithRequest:success:failure:] es asíncrono, por lo que no se almacenará nada en la memoria caché hasta que la solicitud se complete. Si intenta buscar la respuesta en caché dentro del bloque de éxito (o en un bloque de respuesta de caché, como lo hizo en su segunda sección de código), debería funcionar correctamente.

En cuanto a su segunda pregunta, no puede garantizar que NSURLCache almacenará en caché los datos, incluso si los encabezados de Control de caché indican que su contenido no caducará hasta mucho más adelante. El archivo de caché siempre se almacena en el directorio de cachés de su aplicación, que puede ser borrado por iOS en cualquier momento si cree que necesita liberar espacio en el disco.

Si necesita asegurarse de que sus datos JSON estén siempre disponibles, guárdelos usted mismo en la aplicación. Library/Application Support directorio, idealmente con el NSURLIsExcludedFromBackupKey especificado (a menos que su aplicación realmente no pueda funcionar sin los datos).


1
2017-11-12 20:54