/ / Tippen Sie nicht auf die Zelle, um zu wechseln, bis alle Bilder geladen sind - ios, objectiv-c, uitableview, uiimageview

Sie können nicht auf die Zelle tippen, um zu wechseln, bis alle Bilder geladen sind - ios, objectiv-c, uitableview, uiimageview

Ich habe eine Tabellenansicht mit einer Menge Zellen mit einer UIImageView in jeder von ihnen.

Die Bilder werden asynchron aus dem Internet geladen und erscheinen in der entsprechenden Zelle, sobald jedes Bild heruntergeladen wurde.

Das Problem, mit dem ich konfrontiert bin, ist, dass ich bis zum Laden jedes Bildes nicht auf eine Zelle tippen kann, um sie zu einer anderen Ansicht zu wechseln, die mit ihr verknüpft ist.

Ich benutze dispatch_async(dispatch_get_global_queue(0, 0), ^{[self getItemImagesAsync:urlArray];}); um den asynchronen Prozess zu starten, der die Bilder lädt.

das getItemImagesAsync Methode ist hier:

- (void) getItemImagesAsync:(NSArray *)urlArray{

NSMutableArray *imageArray = [[NSMutableArray alloc] init];

ResizedImageData = imageArray;

for (NSString *searchString in urlArray) {

if (!shouldContinueLoadingImages) {
return;
}

[imageArray addObject:[self getImageFromURL:searchString]];
ResizedImageData = imageArray;

[self.tableView reloadData];
}

}

Das shouldContinueLoadingImages Die Variable wird auf false gesetzt, wenn sich die Ansicht ändert (aufgrund einer Suchfunktion), um das unnötige Laden von Bildern zu verhindern.

Alle Bilddaten werden im NSArray gespeichert ResizedImageData

Damit die gesamte Tabelle vor dem Rendern nicht auf das Herunterladen der Bilder warten muss, verwendet der Code eine try-Anweisung in der cellForRowAtIndexPath Methode, um festzustellen, ob ein Bild im Bilddatenarray vorhanden ist:

@try {
cell.imageView.image = [ResizedImageData objectAtIndex:indexPath.row];
}
@catch (NSException *exception) {}

Gibt es ein Grundkonzept, das mir hier fehlt, oder ist es etwas anderes?

Antworten:

1 für die Antwort № 1

Dieser Code weist einige Probleme auf. Sie laden die Daten in einem Hintergrundthread neu. Sie laden die Tabellenansicht häufig neu. Jedes Mal, wenn Sie die Daten neu laden, werden mehrere Ausnahmen ausgelöst.

Es gibt einen einfacheren Ansatz:

NSAssert([urlArray count] > indexPath.row, @"There are more rows than image URLs");
NSInteger index = indexPath.row;
NSString *URLString = [urlArray objectAtIndex:index];

// Prep the cell to download the image
cell.imageView.tag = index; // cell needs to remember which image it"s downloading.
cell.imageView.image = nil; // Remove the image from the previous use of cell.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Download the image in the background
UIImage *image = [self getImageFromURL:URLString];

dispatch_async(dispatch_get_main_queue(), 0), ^{
// Back on the main thread, set the image in the cell.
if (cell.imageView.tag == index) { // only if the cell is on the same index.
cell.imageView.image = image;
}
});
});