2010-08-23 4 views
8

NSData + dataWithContentsOfURL ha alcun tipo di memorizzazione nella cache di default? Qualcuno ha sperimentato qualche tipo di problema usando questo metodo, qual è il modo più efficiente per ottenere dati dal web?NSData dataWithContentsOfURL cache

risposta

3

La documentazione non dice che verrà memorizzata nella cache, quindi penso che dovremmo assumere che non fanno alcuna memorizzazione nella cache.

Quali tipi di dati che si desidera ottenere

UIImage: sì, penso che si dovrebbe usare NSData

video: si consiglia di utilizzare MPMoviePlayerController per lo streaming

Testo: Penso che si possa fare normale NSUrlConnection. Ha anche asincrono, sincronizzato e caching

+0

Ho bisogno di ottenere i file di configurazione in formato XML, dovrei usare NSUrlConnection, giusto? – cesarnicola

+0

Sì, penso che dovresti usare NSUrlConnection e fare asincrono per prevenire il blocco dell'interfaccia utente – vodkhang

8

Usa ASIHTTPRequest. È una libreria client HTTP di terze parti che rende l'interazione di rete MUCH più semplice e ha funzioni di caching molto belle.

AGGIORNAMENTO: Appena ottenuto un downvote su questa risposta, che è un buon promemoria per tornare e aggiornare. Il lotto è cambiato dall'agosto '10. In particolare: ASIHTTPRequest è ora deprecato e il suo autore incoraggia le persone a utilizzare qualcos'altro. AFNetworking sembra una scelta popolare.

+1

Sostituito il mio downvote con un upvote. Non era niente di personale, ovviamente, non volevo che la gente pensasse che fosse ancora una buona risposta. Buon lavoro per l'aggiornamento. :) –

+0

@StevenFisher - Il numero di posti nella mia storia SO in cui consiglio vivamente ASIHTTPRequest è sconcertante. Conto su downvotes per aiutarmi a trovarli tutti! –

+0

Puoi prendere in considerazione l'eliminazione della risposta, almeno in questo contesto ... Non penso che tu debba tornare indietro attraverso tutto. –

5

È consigliabile utilizzare NSURLConnection. Il NSURLRequest che tu gli dai può essere configurato per fare il caching nel modo desiderato, ma per impostazione predefinita farà semplicemente il caching standard delle risorse HTTP che hanno le intestazioni appropriate nella loro risposta.

Questo è quello che faccio:

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

Assicurarsi di mettere questo in un NSOperationQueue che non è la coda principale o off-load dal thread principale in qualche altro modo, però. In alternativa, utilizzare una richiesta asincrona.

+1

Questo ha funzionato per me. – razorhead

-1

se quello che ti serve è scaricare l'immagine da un URL, non preoccuparti di usare alcuna libreria, solo una semplice chiamata dispatch_async dovrebbe essere OK. In questo modo:

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

Problema: l'immagine non è memorizzata nella cache, quindi questo metodo è pesante in rete se la stessa immagine viene riutilizzata in più punti. –

5

Sembra che su iPhone5s la politica predefinita sia quella di memorizzare nella cache (unlinke iPhone5 e versioni precedenti).

È possibile gestire tramite il parametro opzioni il criterio di cache per NSData. Ad esempio, se si desidera evitare la cache, è possibile utilizzare la seguente snipping:

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