Ich möchte Tableview Bilder async, ladenTabellenansicht Bild asynchron laden, aber manchmal wird eine Zelle nie erfolgreich geladen?
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
StickerListItemView *rowView = [tableView makeViewWithIdentifier:StickerTableViewIdentifier
owner:self];
if (!rowView) {
rowView = [[StickerListItemView alloc] initWithFrame:NSMakeRect(0, 0, 460, 300)];
rowView.identifier = StickerTableViewIdentifier;
id obj = [self.stickerListArray objectAtIndex:row];
if ([obj isKindOfClass:[StickerListModel class]]) {
StickerListModel *listModel = (StickerListModel *)obj;
rowView.productId = listModel.productId;
rowView.title = listModel.name;
rowView.intro = listModel.intro;
rowView.status = [self hasStickersDownloaded:listModel.productId];
[rowView setDelegate:self];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^(void) {
NSImage *image = [self getPreviewImageWithMd5:listModel.md5OfPrieviewImage];
//****************************************
NSLog(@"get image at index %ld",(long)row);
if (image) {
dispatch_async(dispatch_get_main_queue(), ^{
rowView.image = image;
[rowView setNeedsDisplay:YES];
//**************************************
NSLog(@"set image at row %ld",(long)row);
});
}
});
}
}
return rowView;
}
Manchmal wird es erfolgreich geladen, aber manchmal eine Zelle wird das Bild nie geladen werden, genau wie das Bild unten: die
Ich warte lange, aber das dritte Bild wurde nie geladen.
hängt davon ab, was Sie reparieren möchten! Wenn es einige Zeit dauern wird, um die Daten zu laden, initialisiere ich normalerweise das TableView mit 'loading ...' oder ähnlichem, und wenn der Ladevorgang fehlschlägt, kann man die Anzeige entweder auf 'nicht verfügbar' setzen oder wiederholen - aber Sie müssen einschränken, wie oft Sie das tun, oder Sie könnten für immer in einer Schleife stecken bleiben. Die wichtigste Sache ist, um sicherzustellen, dass Sie Erfolg und Misserfolg handhaben können, und aktualisieren Sie die Anzeige entsprechend – Russell
@Russell Wirklich danke für die Hilfe, ich kenne Ihre Bedeutung, und ich habe meine Frage ergänzt, die ich mehrmals getestet habe. Und stellt sich heraus, dass die erste zu ladende Zelle immer nicht erfolgreich geladen werden kann, ich weiß wirklich nicht, warum die erste immer fehlschlägt. Vielleicht gibt es eine Begrenzung der Anzahl der URL-Verbindungen? – melody5417
Es sieht so aus, als wäre Ihr 'image' -Objekt, das mit' getPreviewImageWithMd5' erstellt wurde, NULL. Sie sollten diese Methode einchecken. –