2009-07-15 21 views
58

Ich habe etwa 50 benutzerdefinierte Zellen in meinem UITableView. Ich möchte ein Bild und ein Label in den Zellen anzeigen, wo ich die Bilder von URLs bekomme.Lazy laden Bilder in UITableView

Ich möchte eine Lazy Load von Bildern, so dass die Benutzeroberfläche nicht einfrieren, während die Bilder geladen werden. Ich habe versucht, die Bilder in separaten Threads zu bekommen, aber ich muss jedes Bild jedes Mal laden, wenn eine Zelle wieder sichtbar wird (ansonsten zeigt die Wiederverwendung von Zellen alte Bilder an). Kann mir bitte jemand sagen, wie man dieses Verhalten kopiert?

+0

Ich wünschte, es wäre ein Leistungsvergleich aller dieser Caching-Komponenten. – neoneye

+0

Weg 1: benutze nsoperationsqueue Weg 2: Blockcodierung Weg 3: Bibliothek –

Antwort

-1

Mir ist keine eingebaute Möglichkeit bekannt, dies zu tun, aber es klingt, als ob Sie bereits etwas mit einem anderen Thread arbeiten.

Unter der Annahme, dass Ihre einzige verbleibende Problem ist jetzt, den Inhalt einer Zelle ungültig zu machen, wenn es wieder in Sicht kommt man sich anschaut, sollte:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

Mit der Umsetzung dieses Delegatmethode Sie den Inhalt der Zelle überprüfen konnte, bevor Es zeigt an, ob es neue Inhalte benötigt. Wenn dies der Fall ist, können Sie den Inhalt der Zellen leeren und das Laden des Threads erneut auslösen.

Sie könnten auch einen Code schreiben.

26

Es gibt eine Vey gute offiziellen Beispiel hier von Apple: LazyTableImages Ich glaube, Sie den richtigen Ansatz in dort finden ....

+0

Ich muss sagen, dass SDWebImage viel einfacher und optimierter ist, als zu versuchen, diese Dinge zu dekodieren. Aber wenn Sie eine Lernerfahrung möchten, um dies selbst zu tun, empfehle ich Ihnen, LeMarcs Tutorial stattdessen zu lesen: http://iphonedevelopment.blogspot.com/2010/05/downloading-images-for-table-without.html – JeroenEijkhof

+0

Lazy Table Bilder Aktualisierter Link: https://developer.apple.com/library/prerelease/content/samplecode/LazyTableImages/Introduction/Intro.html – GoodSp33d

3

ich für eine NSOperation gehen würde vorschlagen, und tun, was Sie brauche einen anderen Thread.

Dies ist ein Klasse I für die Bild Laden schrieb:

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url { 
    if(self = [super init]) { 
     if(url == nil || [url isEqualToString:@""]) 
      return nil; 
     target = trgt; 
     action = sel; 
     imgURL = [[NSURL alloc] initWithString: url]; 
    } 
    return self; 
} 

- (void)main { 
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil]; 
} 

- (void)loadImage { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    UIImage *img = [UIImage imageNamed: @"default_user.png"]; 
    if(![[imgURL absoluteString] isEqualToString: @"0"]) { 
     NSData *imgData = [NSData dataWithContentsOfURL: imgURL]; 
     img = [UIImage imageWithData: imgData]; 
    } 
    if([target respondsToSelector: action]) 
     [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES]; 
    [pool release]; 
} 

- (void)dealloc { 
    [imgURL release]; 
    [super dealloc]; 
} 

Hoffnung, das hilft!

2

Sie können auch versuchen EGOImageLoading. Es gibt auch eine Demo, die zeigt, wie man es benutzt.

8

Ich habe eine kostenlose Bibliothek nur für diese ... HJCache. Es ist sehr einfach zu bedienen. iphone-image-cache

+17

SDWebImage ist viel eleganter als Mark Johnsons HJCache. MEINER BESCHEIDENEN MEINUNG NACH. Entschuldigung Markierung. – fuzz

85

Kasse SDWebImage

README Abschnitt sagt, wie es in Ihrer Anwendung zu verwenden.

+10

Möchte das noch mehr abstimmen :) Ich empfehle diese Bibliothek wirklich, da sie sowohl sehr schnell, super einfach mit viel Raum ist, um flexibel zu sein, wie sie implementiert werden sollte. – JeroenEijkhof

+0

Hat jemand das erfolgreich in xcode 4.2 installiert? Ich habe Probleme, die öffentlichen Header nicht zu finden. – rjgonzo

+0

Hey für mich seine Fehlermeldung bei #import , die nicht gefunden wurde, folgte ich den Schritten für nicht ARC. –

0

Ich denke, es ist eine andere Art und Weise, dieses Problem zu lösen, wenn Sie das Bild geladen werden soll dann zu Beginn der Ansicht, das ist meine

wenn -(void)loadView wird geladen, dann nur diese Bilder zuordnen und sie in ein nsarray nehmen Jetzt, wenn die Tabellenzelle geladen wird, machen Sie Ihre Ansicht in der Tabellenzelle und ersetzen Sie gemäß der indexPath.row diese Bilder von nsarray in diese Ansicht als Hintergrundbild oder machen Sie eine Unteransicht dieser Bilder in dieser neuen Ansicht der Tabellenzelle mit nsarray Index und indexPath.row von die Tabellenansichtszelle

+0

Ich brauche genau diese Lösung. Aber ich kann keinen Beispielquellcode finden. Hat jemand das Beispiel? –

1

Vielleicht können Sie einen Versuch haben ALImageView .Es ist viel einfacher als SDWebImage.You brauchen nur zwei Quelldateien (ALImageView.h/ALImageView.m) .Sie können die Bildansicht wieder verwenden unterschiedliche URLs in einem Tableview nachladen Zelle.

  1. Unterstützt lokalen und Speichercache;
  2. Stützplatzhalter;
  3. Unterstützung Tippen berühren (Ziel-Aktion);
  4. Stützecke für die Bildansicht;

Es gibt auch eine gute Demo.

16

Versuchen Sie AFNetworking Klasse diese Klasse in diesem Link https://github.com/AFNetworking/AFNetworking herunterladen. die alle AFNetworking Klasse in Ihrer project.Then hinzufügen importieren nur diese Kategorie

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview. 

Dann in cellForRowAtIndexPath: wie setzen unter

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    if (cell == nil) 
    { 
     cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]]; 
    cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell;  
} 

Dieses laden Sie Bild für Imageview in der UITableViewCell asynchron. Es wird nicht immer wieder heruntergeladen, während der Benutzer die Tabellenansicht scrollt, weil es auch einen Cache hat. Sobald Sie Ihr Bild herunterladen, speichern Sie das Bild mit dem Schlüssel Ihres imageUrl. Ich hoffe es ist nützlich für dich.

1

können Sie versuchen, diese lazyTableImages,


i lazyTableImages dieses Projekt in ein sehr einfaches angepasst hatte (customizeLazyTableImages) und entfernt alle zusätzlichen Codes mit einigen statischen URLs und Titel nur dies Bilder sehr glatt Laden und sie Cachen


+0

Ich benutze das, es ist toll, bro nette Arbeit Kumpel. –

2

Sie Ego Bild verwenden können button..you Ego Bild, um Dateien von github herunterladen ... fügen Sie in Ihrem Projekt ....

Änderung der Klasse „Ego Bildtaste“ am Bildansicht in Ihrem xib ...

verzögertes Laden synchrone Anforderung wird ..

heißt

Ego Bild asynchrone Anforderung genannt. ego image dont warte auf Antwort..alle Bilder gleichzeitig anzeigen ..

0

Sie können die NSOperation Queue oder GCD zum Laden von Bildern im Hintergrund verwenden.

Wenn Sie Bilder nicht immer wieder laden möchten, können Sie NSCache oder das Dateisystem zum Speichern der Bilder verwenden.