2013-10-13 6 views
7

Ich lade einige Bilder aus dem Internet in einer Tabellenansicht innerhalb cellForRowAtIndexPath. Hier ist mein Code:Tabellenansicht scroll spacing bei Verwendung von SDWebImage

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *MyIdentifier = @"ArticleCell"; 
    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    Article *article = [parser items][indexPath.row]; 

    cell.title.text = article.title; 
    cell.newsDescription.text = article.description; 
    [cell.image setImageWithURL:[NSURL URLWithString:article.image]]; 

    return cell; 
} 

Mein Problem ist, dass selbst wenn ich SDWebImage, wenn ich nach unten scrollen, meine App noch nacheilt. Hier sind einige Screenshots von Instruments:

enter image description here

enter image description here

+0

Wie groß sind die Bilder? – Wain

+0

naja, etwas zwischen 50.000 und 200.000, sagen wir mal 150 KB – Kobe

+0

Welchen Typ haben die Bilder? TIFF? – Wain

Antwort

5

Es sieht so aus, als ob der Download des Bildes in einem Hintergrundthread durchgeführt wird, die Arbeit mit den Bilddaten im Hauptthread erfolgt und somit Ihre Anwendung blockiert. Sie könnten den von SDWebImage bereitgestellten asynchronen Bild-Downloader ausprobieren.

[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL 
                options:0 
                progress:^(NSUInteger receivedSize, long long expectedSize) 
                { 
                 // progression tracking code 
                } 
                completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) 
                { 
                 if (image && finished) 
                 { 
                  // do something with image 
                 } 
                } 
]; 

In Ihrer Methode soll wie folgt aussehen:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *MyIdentifier = @"ArticleCell"; 
    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    Article *article = [parser items][indexPath.row]; 

    cell.title.text = article.title; 
    cell.tag = indexPath.row; 
    cell.newsDescription.text = article.description; 
    [SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL 
                 options:0 
                 progress:nil 
                 completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) 
    { 
     if (cell.tag == indexPath.row && image && finished) 
     { 
      dispatch_async(dispatch_get_main_queue(), ^(){ 
       cell.image = image; 
      }); 

     } 
    }]; 

    return cell; 
} 
+0

1) Es verfolgt nicht die Bildansicht, so dass die Bilder beim Scrollen nicht auf korrekte Bildansichten gesetzt werden. 2) Bilder gehen beim Scrollen aus und erscheinen nach einiger Zeit wieder. Scheint, nicht mit Cache – Developer

+0

@Developer Ich bearbeitete, um 1 zu beheben. –

+0

Über Nummer 2, speichert SDWebImageDownloader Bilder standardmäßig. –

1

Laden Sie das Bild auf einem separaten Thread, etwa so:

NSURLRequest *request = [NSURLRequest requestWithURL:yourURL]; 
         [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
          if (data) 
          { 
           UIImage *image = [[UIImage alloc] initWithData:data]; 
           [cell.image setImage:image]; 
          } 
         }]; 
+0

@vBx sagte er benutzt bereits die sdWebImage Erweiterung, die einen getrennten Thread verwendet. – ThorstenC

0

überprüfen Sie Bilder, überprüfen Sie die Art und Größe und wichtiger: Sind ein oder mehr Bild durch das Dateiformat in irgendeiner Weise gebrochen? Dateigröße zu groß, unregelmäßige (zu große) Grenzen?

Versuchen Sie, verdächtige Bilddateien mit einem Bildeditor zu öffnen und erneut zu speichern, um sicherzustellen, dass das interne Dateiformat OK ist.

1

Dies ist wahrscheinlich weniger mit Netzwerkaktivität und mehr zu tun mit Ihrer Bildgröße zu tun. Die Größenänderung von Bildern, insbesondere für nicht ganzzahlige Multiplikatoren, ist teuer. Wenn Ihre Bilder wesentlich größer sind als die Ansicht, in die Sie sie einfügen, müssen Sie die Größe ändern und sie in einem Hintergrundthread zwischenspeichern und auf die zwischengespeicherte Kopie in Ihrer Ansicht verweisen.

Um zu überprüfen, ob dies Ihr Problem ist, laden Sie alle Bilder manuell herunter und verweisen Sie auf die lokale Kopie. Wenn ich richtig bin, wird Ihr UITableView immer noch auf die gleiche Weise zurückbleiben.