2010-08-23 15 views
8

NSData + dataWithContentsOfURL tiene algún tipo de almacenamiento en caché por defecto? ¿Alguien ha experimentado algún tipo de problema con este método? ¿Cuál es la forma más eficiente de obtener datos de la web?NSData dataWithContentsOfURL caché

Respuesta

3

La documentación no indica que se almacenará en caché, por lo que creo que debemos suponer que no hacen ningún almacenamiento en caché.

¿Qué tipo de datos que desea obtener

UIImage: sí, creo que se debe utilizar NSData

vídeo: se debe utilizar MPMoviePlayerController para la transmisión de

Texto: Creo que se puede hacer la normalidad NSUrlConnection. También tiene asíncrono, sincrónico y en caché

+0

que necesito para obtener los archivos de configuración en formato XML, que debo usar NSURLConnection, ¿verdad? – cesarnicola

+0

Sí, creo que debería usar NSUrlConnection y hacer asyncrhonous para evitar el bloqueo de UI – vodkhang

8

Use ASIHTTPRequest. Es una biblioteca de cliente HTTP de terceros que hace que la interacción de red sea MUCHO más simple y tiene funciones de almacenamiento en caché muy agradables.

ACTUALIZACIÓN: Acabo de recibir un voto a favor en esta respuesta, que es un buen recordatorio para volver y actualizar. Lot ha cambiado desde agosto de 2010. En particular: ASIHTTPRequest ahora está en desuso, y su autor está alentando a las personas a usar algo más. AFNetworking parece una opción popular.

+1

Reemplazó mi voto con un voto activo. No era nada personal, obviamente, simplemente no quería que la gente pensara que todavía era una buena respuesta. Buen trabajo en la actualización. :) –

+0

@StevenFisher - La cantidad de lugares en mi historial SO en los que sinceramente recomiendo ASIHTTPRequest es asombroso. ¡Estoy contando con votos a favor para ayudarme a encontrarlos todos! –

+0

Es posible que desee considerar eliminar la respuesta, al menos en este contexto ... No creo que tenga que volver a revisar todo. –

5

Lo mejor es usar NSURLConnection. La solicitud NSURLRequest que le des puede configurarse para hacer el almacenamiento en caché de la forma que desees, pero de forma predeterminada solo hará el almacenamiento en caché estándar de los recursos HTTP que tienen los encabezados apropiados en su respuesta.

Esto es lo que hago:

NSData *data = [NSURLConnection sendSynchronousRequest: 
       [NSURLRequest requestWithURL:url] 
            returningResponse:nil 
               error:&error]; 

Asegúrese de poner esto en un NSOperationQueue que no es su cola principal fuera de cargarlo desde el hilo principal de alguna otra manera, sin embargo. Alternativamente, use una solicitud asincrónica.

+1

Esto funcionó para mí. – razorhead

-1

si lo que necesita es solo descargar una imagen de una url, no se moleste en usar ninguna biblioteca, solo una simple llamada dispatch_async debería estar bien. de esta manera:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) 
{ 
    NSData * data = [NSData dataWithContentsOfURL:imageUrl]; 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     self.image = [UIImage imageWithData:data]; 
    }); 
}); 
+1

El problema es que la imagen no está en la memoria caché, por lo que este método es pesado en la red si la misma imagen se reutiliza en muchos lugares. –

5

Parece que en iPhone5s la política por defecto es de caché (unlinke iPhone5 y anteriores).

Puede manejar a través del parámetro de opciones la política de caché para NSData. Por ejemplo, si se quiere evitar la caché, el siguiente cortó puede utilizar:

[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url] options:NSDataReadingUncached error:nil];