web-dev-qa-db-de.com

Faule Bilder in UITableView laden

Ich habe ungefähr 50 benutzerdefinierte Zellen in meiner UITableView. Ich möchte ein Bild und eine Beschriftung in den Zellen anzeigen, in denen die Bilder von URLs abgerufen werden.

Ich möchte eine träge Ladung von Bildern erstellen, damit die Benutzeroberfläche nicht einfriert, während die Bilder geladen werden. Ich habe versucht, die Bilder in separaten Threads zu erhalten, aber ich muss jedes Bild jedes Mal neu laden, wenn eine Zelle wieder sichtbar wird. Kann mir jemand bitte sagen, wie ich dieses Verhalten duplizieren kann.

58
ronny

Probieren Sie AFNetworking aus. Diese Klasse in diesem Link herunterladen https://github.com/AFNetworking/AFNetworking . Fügen Sie die gesamte AFNetworking-Klasse in Ihr Projekt ein. Importieren Sie dann einfach diese Kategorie 

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

Dann in cellForRowAtIndexPath: wie unten angegeben

-(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;    
}

Laden Sie Ihr Image für imageView asynchron in die UITableviewcell herunter. Es wird nicht immer wieder heruntergeladen, während der Benutzer die Tableview durchblättert, da er auch Cache hat. Sobald Ihr Bild heruntergeladen wurde, speichern Sie das Bild mit dem Schlüssel Ihrer imageUrl. Ich hoffe es ist nützlich für dich.

17
TamilKing

Ich würde vorschlagen, dass Sie sich für eine NSOperation entscheiden und alles tun, was Sie in einem anderen Thread benötigen.

Dies ist eine Klasse, die ich zum Laden von Bildern geschrieben habe:

- (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];
}

Hoffentlich hilft das!

3
natanavra

sie können Ego-Image-Button verwenden. Sie können Ego-Image-Button-Dateien von Github herunterladen ... fügen Sie Ihrem Projekt hinzu ....

Ändern Sie die Klasse "Ego-Bild-Schaltfläche" in der Bildansicht in Ihrer Xib ...

faules Laden wird als synchrone Anforderung bezeichnet.

ego-Image wird als asynchrone Anforderung bezeichnet. Ego-Bild wartet nicht auf Antwort .. zeigt alle Bilder auf einmal an .. 

2
Divine_Code

sie können dies versuchen lazyTableImages


ich hatte dieses Projekt in ein sehr einfaches lazyTableImages umgewandelt ( customLazyTableImages ) und alle zusätzlichen Codes mit einigen statischen URLs und Titeln entfernt, nur das lädt Bilder sehr problemlos und speichert sie im Cache


1
ShujatAli

Vielleicht haben Sie einen Versuch ALImageView . Dies ist viel einfacher als SDWebImage. Sie benötigen nur zwei Quelldateien (ALImageView.h/ALImageView.m) eine Tableview-Zelle. 

  1. Unterstützt lokalen Cache und Speichercache;
  2. Stützplatzhalter;
  3. Support Tippen Sie auf (Zielaktion);
  4. Unterstützungsecke für die Bildansicht;

Es gibt auch eine gute Demo.

1
jiachunke

Ich denke, es gibt einen anderen Weg, um dieses Problem zu lösen, wenn Sie das Bild dann am Anfang der Ansicht laden möchten 

wenn -(void)loadView geladen wird, ordnen Sie diese Bilder einfach zu und nehmen Sie sie in eine nsarray. Jetzt, wenn die Tabellenzelle geladen wird, legen Sie Ihre Ansicht in der Tabellenzelle fest und ersetzen Sie diese Bilder gemäß - indexPath.row einfach in nsarray diese Ansicht als Hintergrundbild verwenden oder eine Unteransicht dieser Bilder in dieser neuen Ansicht der Tabellenzelle erstellen, indem Sie nsarray index und indexPath.row der Tabellenzelle verwenden.

0
Emon

Sie können die NSOperation-Warteschlange oder GCD verwenden, um Bilder im Hintergrund zu laden.

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

0
vikram