2010-08-23 3 views
8

NSData + dataWithContentsOfURL hat standardmäßig irgendeine Art von Zwischenspeicherung? Hat jemand mit dieser Methode einige Probleme untersucht, was ist der effizienteste Weg, um Daten aus dem Internet zu erhalten?NSData dataWithContentsOfURL Cache

Antwort

3

Die Dokumentation sagt nicht, dass es zwischengespeichert wird, also sollten wir davon ausgehen, dass sie kein Caching durchführen.

Welche Arten von Daten, die Sie

UIImage zu wollen: Ja, ich glaube, Sie NSData verwenden sollten

Video: Sie MPMoviePlayerController für das Streaming von

Text verwenden sollte: Ich denke, man kann normale tun NSUrlConnection. Es hat auch asynchrone, synchrone und Caching

+0

Ich brauche Konfigurationsdateien im XML-Format zu bekommen, sollte ich NSURLConnection verwenden, nicht wahr? – cesarnicola

+0

Ja, ich denke, Sie sollten NSUrlConnection verwenden und Asyncronous tun, um die Blockierung der UI zu verhindern – vodkhang

8

Verwendung ASIHTTPRequest. Es ist eine HTTP-Client-Bibliothek von Drittanbietern, die die Netzwerkinteraktion VIEL einfacher macht und sehr nette Cache-Funktionen hat.

UPDATE: Habe gerade einen Kommentar zu dieser Antwort erhalten, was eine gute Erinnerung ist, um zurück zu kommen und zu aktualisieren. Lot hat sich seit August '10 geändert. Vor allem: ASIHTTPRequest ist jetzt veraltet, und der Autor ermutigt die Leute, etwas anderes zu verwenden. AFNetworking scheint eine beliebte Wahl zu sein.

+1

Ersetzt meine Downvote mit einem upvote. War natürlich nichts Persönliches, ich wollte einfach nicht, dass die Leute denken, es sei immer noch eine gute Antwort. Gute Arbeit am Update. :) –

+0

@StevenFisher - Die Anzahl der Orte in meiner SO-Geschichte, wo ich wärmstens ASIHTTPRequest empfehle, ist atemberaubend. Ich zähle auf downvotes, um mir zu helfen, sie alle zu finden! –

+0

Vielleicht möchten Sie in Erwägung ziehen, die Antwort zu löschen, zumindest in diesem Zusammenhang ... Ich glaube nicht, dass Sie alles durchgehen müssen. –

5

Es ist am besten, NSURLConnection zu verwenden. Die NSURLRequest, die Sie angeben, kann so konfiguriert werden, dass das Caching wie gewünscht ausgeführt wird. Standardmäßig wird jedoch nur das Standard-Caching von HTTP-Ressourcen durchgeführt, die in ihrer Antwort die entsprechenden Header enthalten.

Das ist, was ich tue:

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

Stellen Sie sicher, dies in einem NSOperationQueue zu setzen, die nicht Ihre Haupt-Warteschlange oder off-laden sie aus dem Haupt-Thread auf andere Weise, though. Verwenden Sie alternativ eine asynchrone Anforderung.

+1

Das hat bei mir funktioniert. – razorhead

-1

Wenn Sie nur das Bild von einer URL herunterladen möchten, verwenden Sie keine Bibliotheken, nur ein einfacher dispatch_async-Aufruf sollte OK sein. dies wie:

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

Problem ist, dass das Bild nicht zwischengespeichert wird, daher ist diese Methode netzwerklastig, wenn dasselbe Bild an vielen Stellen wiederverwendet wird. –

5

Es scheint, dass auf iPhone5s die Standardrichtlinie Cache (unlinke iPhone5 und früher).

Sie können über den Optionsparameter die Cache-Richtlinie für NSData bearbeiten. Zum Beispiel, wenn Sie Cache vermeiden möchten, können die folgenden snipped verwendet werden:

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