2016-03-24 16 views
1

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 enter image description here

Ich warte lange, aber das dritte Bild wurde nie geladen.

+0

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

+0

@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

+0

Es sieht so aus, als wäre Ihr 'image' -Objekt, das mit' getPreviewImageWithMd5' erstellt wurde, NULL. Sie sollten diese Methode einchecken. –

Antwort

0

Es sieht so aus, als würde diese Zeile null zurückgeben.

Sie sollten den Wert des Bildes überprüfen, um sicherzustellen, dass es nicht Null ist und möglicherweise einige Fehlerbehandlung hinzufügen. Vielleicht so etwas.

if (image) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     rowView.image = image; 
     [rowView setNeedsDisplay:YES]; 
     NSLog(@"set image at row %ld",(long)row); 
    }); 
} else { 
    NSLog(@"Received nil image for row %ld", (long)row); 
    //possibly set a placeholder image for this row instead 
} 
+0

danke für den Rat, ich werde so umgehen. Und in getPreviewImageWithMd5: Ich erstelle das Image mit [nsimage imageWithData: [NSData dateWithContentsOfURl:]], ich googelte dieses wird in der Hauptwarteschlange betrieben, vielleicht ist es der Grund für dieses Problem, denke ich, weil ich es zu [NSURLConnection sendAsynchronousRequest geändert. .....] und alles hat funktioniert, nun, ich denke, weißt du den Grund, wirklich danke für die Hilfe ~ – melody5417

+0

Danke für die Hilfe, ich weiß nur, dass ich auf den Scheck klicken sollte, um die akzeptierte Antwort zu markieren. – melody5417

Verwandte Themen