2012-04-15 4 views
0

Ich lade Bilder asynchron auf ein UITableView (GCD) und sehe ein seltsames Verhalten, bei dem die Zelle mehrere Bilder "durchblendet", bevor sie sich auf einem setzt. Es ist schwer in Worten zu beschreiben, also habe ich eine Bildschirmaufnahme gemacht, wo man sieht, dass für eine bestimmte Zelle mehrere Bilder durchgehen, bevor sie sich auf einem setzen.UITableView asynchrone Bild lädt Shutters durch mehrere Bilder

http://www.youtube.com/watch?v=PKuqng81QX4

I eine Warteschlange bin mit dem Bild zu holen (von einem REST Endpunkt), und dann wird die Hauptwarteschlange das Bild in der Zelle einzustellen. Hier ist der Code-Schnipsel:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

// ..after getting the cell: 

    dispatch_queue_t imageQ = dispatch_queue_create("imageQ", NULL); 
    dispatch_async(imageQ, ^{ 
     NSString *galleryTinyImageUrl = someFunctionToGetThumbnailUrl; 
     NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.imageView.image = [UIImage imageWithData:imageData]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     }); 
    }); 
    dispatch_release(imageQ); 

Die Tatsache, dass diese mehrfach in kurzer Zeit (dh einen Benutzer Flicks auf dem Tisch, die Auslösung 30 dieser Zelle Bild lädt abzufeuern) immer genannt Anlass zur Sorge für mich, ob Alle asynchronen Threads "landen" sicher dort, wo sie hingehören. Das Verhalten, das ich (im Video) sehe, scheint zu bestätigen, dass ich hier etwas falsch mache. Ich würde mich über alle Details oder Vorschläge für allgemeine Ansätze freuen, die Sie haben könnten.

Danke für die Hilfe!

Antwort

2

Klingt, als ob Sie die Wiederverwendung von Zellen nicht ordnungsgemäß implementiert haben. Stellen Sie sicher, dass Sie bei der Wiederverwendung einer Zelle über [tableView dequeueReusableCellWithIdentifier:blah] das Zellenbild auf nil setzen, bis das neue Bild vollständig heruntergeladen wurde und zur Anzeige bereit ist.

Wenn Sie eine Zelle erneut verwenden, brechen Sie eine möglicherweise ausgeführte Anforderung für ihr Image ab, um zu verhindern, dass ein Image einer vorherigen Zelle langsamer geladen wird und dadurch die echte Zelle überschrieben wird.

+0

Vielen Dank! Ich fügte 'cell.imageView.image = nil;' direkt unter dem Holen einer neuen/Wiederverwendungszelle hinzu und das reparierte es! – Steven

+0

Ich bin froh, dass ich dir helfen konnte. –

+0

Wie kann ich Download Image in Schleife vermeiden? – mikezang