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
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
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.
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. :) –
@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! –
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. –
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.
Das hat bei mir funktioniert. – razorhead
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];
});
});
Problem ist, dass das Bild nicht zwischengespeichert wird, daher ist diese Methode netzwerklastig, wenn dasselbe Bild an vielen Stellen wiederverwendet wird. –
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];
Ich brauche Konfigurationsdateien im XML-Format zu bekommen, sollte ich NSURLConnection verwenden, nicht wahr? – cesarnicola
Ja, ich denke, Sie sollten NSUrlConnection verwenden und Asyncronous tun, um die Blockierung der UI zu verhindern – vodkhang