Beste Weg, um cache-Bilder auf ios-app?
Kurz, ich habe eine NSDictionary
mit urls für die Bilder, die ich brauche, um zu zeigen, in meinem UITableView
. Jede Zelle hat einen Titel und ein Bild. Ich hatte erfolgreich das passieren, obwohl das scrollen war hinterher, als es schien, dass die Zellen heruntergeladen Ihr Bild jedes mal kamen Sie in den Bildschirm.
Ich suchte ein bisschen und fand SDWebImage
auf github. Dies machte die scroll-lagg Weg. Ich bin nicht ganz sicher, was es Tat, aber ich glaubte, es habe einige caching.
Aber! Jedes mal, wenn ich öffnen Sie die app zum ersten mal, ich sehe KEINE Bilder, und ich muss scrollen Sie nach unten, und back-up für Sie, um anzukommen. Und wenn ich die app beenden mit der home-Taste, und öffnen Sie wieder, dann ist es seemes wie das caching funktioniert, weil die Bilder auf dem Bildschirm sichtbar sind, jedoch, wenn ich gehe eine Zelle nach unten, dann die nächste Zelle hat kein Bild. Bis ich scrollen Sie vorbei und sichern, oder wenn ich drauf klicke. Ist dies, wie der Cache funktionieren soll? Oder was ist der beste Weg, um cache-Bilder aus dem Internet heruntergeladen? Die Bilder werden laufend aktualisiert, sind rarily, also ich war in der Nähe, nur importieren Sie Sie auf das Projekt, aber ich möchte die Möglichkeit haben, zu aktualisieren, Bilder hochladen ohne ein update..
Ist es unmöglich zum laden der Bilder für die gesamte tableview form der cache(gegeben, dass es etwas in den cache) zu starten? Das ist, warum ich manchmal sehen, Zellen ohne Bilder?
Und ja, ich habe eine harte Zeit zu verstehen, was cache ist.
--EDIT--
Habe ich versucht, diese mit nur Bilder der gleichen Größe (500x150), und das aspect-Fehler ist Weg, aber wenn ich nach oben oder unten scrollen, dort sind-Bilder auf allen Zellen, aber Erstens sind Sie falsch. Nachdem die Zelle wurde in der Ansicht für einige Millisekunden, das richtige Bild wird angezeigt. Das ist unglaublich ärgerlich, aber vielleicht, wie es sein muss?.. Es seemes wie er wählt die falsche index aus dem cache auf den ersten. Wenn ich einen Bildlauf langsam ist, dann sehe ich die Bilder blinken vom falschen Bild, die richtigen sind. Wenn ich schnell Rollen, dann glaube ich, die falschen Bilder sind jederzeit sichtbar, aber ich kann nicht sagen, aufgrund der schnellen scrollen. Wenn der schnelle Bildlauf verlangsamt und schließlich Stoppt, die falschen Bilder immer noch angezeigt werden, aber sofort, nachdem es nicht scrollen, es updates zu den richtigen Bildern. Ich habe auch eine benutzerdefinierte UITableViewCell
Klasse, aber ich habe nicht große Veränderungen.. ich habe nicht gegangen durch meinen code sehr viel noch, aber ich kann nicht glauben, was falsch sein kann.. Vielleicht habe ich irgendwas in der falschen Reihenfolge.. ich habe viel programmiert in java, c#, php etc, aber ich habe eine harte Zeit zu verstehen, Objective-c, mit allen .h
und .m
...
Ich habe auch `
@interface FirstViewController : UITableViewController{
/**/
NSCache *_imageCache;
}
(neben anderen Variablen) in FirstViewController.h
. Ist diese nicht korrekt?
Hier mein cellForRowAtIndexPath
.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];
NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL);
UIImage *image = [_imageCache objectForKey:imageName];
if(image)
{
cell.imageView.image = image;
}
else
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString* imageURLString = [NSString stringWithFormat:@"example.com/%@", imageName];
NSURL *imageURL = [NSURL URLWithString:imageURLString];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];
if(image)
{
dispatch_async(dispatch_get_main_queue(), ^{
CustomCell *cell =(CustomCell*)[self.tableView cellForRowAtIndexPath:indexPath];
if(cell)
{
cell.imageView.image = image;
}
});
[_imageCache setObject:image forKey:imageName];
}
});
}
cell.textLabel.text = [dict objectForKey:@"Name"];
return cell;
}
InformationsquelleAutor der Frage Sti | 2012-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Caching bedeutet nur, halten Sie eine Kopie der Daten, die Sie benötigen, so dass Sie nicht haben, um es zu laden von einigen langsameren Quelle. Zum Beispiel Mikroprozessoren haben oft cache-Speicher, wo Sie halten Kopien der Daten, so dass Sie nicht haben, um Zugriff auf RAM, das ist viel langsamer. Festplatten haben oft Speicher-caches, aus denen die Datei-system können viel schneller den Zugang zu dem Block von Daten, auf die zugegriffen wurde, vor kurzem.
Ebenso, wenn Ihre app lädt eine Menge Bilder aus dem Netz, kann es in Ihrem Interesse cache auf dem Gerät statt Sie herunterzuladen jedes mal, wenn Sie Sie benötigen. Es gibt viele Möglichkeiten, das zu tun-es klingt wie Sie bereits gefunden. Möchten Sie vielleicht, um die Bilder zu speichern Sie den download in Ihrem app /Library/Caches-Verzeichnis, vor allem, wenn Sie nicht erwarten, dass Sie ändern. Laden der Bilder aus dem sekundären Speicher wird viel, viel schneller als das laden über das Netzwerk.
Sie könnten auch interessiert sein in der wenig bekannten NSCache Klasse für die Beibehaltung der Bilder, die Sie brauchen, in Erinnerung. NSCache funktioniert wie ein Wörterbuch, aber wenn der Speicher knapp wird es beginnen die Freigabe einige seiner Inhalte. Sie können den cache für ein bestimmtes Bild zuerst, und wenn Sie nicht finden, dort können Sie sich dann in Ihre caches-Verzeichnis, und wenn Sie nicht finden, dort können Sie es herunterladen. Keine dies beschleunigt das laden der Bilder auf Ihre app das erste mal Sie es starten, aber sobald Ihr die app heruntergeladen hat, die meisten von dem, was es braucht, es werden viel mehr reagieren.
InformationsquelleAutor der Antwort Caleb
Ich denke, Caleb antwortete der caching-Frage. Ich war gerade dabei zu berühren, auf den Prozess für die Aktualisierung Ihrer Benutzeroberfläche, wie Sie Bilder abrufen, z.B. vorausgesetzt, Sie haben eine
NSCache
für Ihre Bilder, sogenannte_imageCache
:Definieren Sie zuerst eine operation queue-Eigenschaft für das tableview:
Dann in
viewDidLoad
initialisieren:Und dann in
cellForRowAtIndexPath
konnten Sie dann:Ich nur erwähnen, das wie ich gesehen habe ein paar code-Beispiele, die herum schwimmt auf, SO dass vor kurzem, dass die Verwendung GCD zu aktualisieren, die entsprechenden
UIImageView
image
Eigenschaft, sondern in den Prozess der Versand der UI-update zurück auf die Haupt-Warteschlange, die Sie beschäftigen, neugierig Techniken (z.B., ein Neuladen der Zelle oder Tabelle, nur aktualisieren Sie die Bild-Eigenschaft der vorhandenencell
- Objekt zurückgegeben, an der Spitze dertableView:cellForRowAtIndexPath
(das ist ein problem, wenn die Zeile gescrollt wurden, aus dem Bildschirm und die Zelle wurde aus der Warteschlange entfernt und wiederverwendet werden für eine neue Zeile), etc.). Durch die VerwendungcellForRowAtIndexPath
(nicht zu verwechseln mittableView:cellForRowAtIndexPath
), können Sie bestimmen, ob die Zelle immer noch sichtbar ist und/oder ob es möglicherweise gescrollt haben ab und wurde aus der Warteschlange entfernt und wiederverwendet werden.InformationsquelleAutor der Antwort Rob
Die einfachste Lösung ist, gehen Sie mit etwas, das stark benutzt wurde, dass die Belastung getestet.
SDWebImage ist ein leistungsfähiges Werkzeug, das mir geholfen zu lösen ein ähnliches problem und kann leicht installiert werden, w/Kakao-Schoten. Im podfile:
Setup-cache:
Cache Bild:
https://github.com/rs/SDWebImage
InformationsquelleAutor der Antwort Matt Perejda
Ich glaube, es wird besser für Euch user so etwas wie DLImageLoader.
Mehr info -> https://github.com/AndreyLunevich/DLImageLoader-iOS
InformationsquelleAutor der Antwort MaeSTRo
Für den Teil der Frage, über falsche Bilder, es ist, weil der Wiederverwendung von Zellen. Wiederverwendung von Zellen bedeutet, dass die vorhandenen Zellen, die gehen (zum Beispiel, die Zellen, die gehen aus dem Bildschirm heraus in die Spitze, wenn Sie einen Bildlauf nach unten sind diejenigen, die wieder kommen von unten.) Und so bekommt man falsche Bilder. Aber sobald die Zelle angezeigt wird, den code für das abrufen der richtigen Bild führt, und Sie erhalten die entsprechenden Bilder.
Können Sie einen Platzhalter in 'prepareForReuse' - Methode der Zelle. Diese Funktion wird meist verwendet, wenn Sie müssen Sie zum zurücksetzen der Werte wenn die Zelle gebracht ist, für die Wiederverwendung. Einstellung ein Platzhalter, hier wird sicherstellen, dass Sie nicht bekommen, jede falsche Bilder.
InformationsquelleAutor der Antwort Swasidhant
Caching-images getan werden kann, so einfach wie diese.
ImageService.m
SomeViewController.m
InformationsquelleAutor der Antwort tsuz
InformationsquelleAutor der Antwort Kausik Jati