Beste Weg, um Bilder auf iOS-App zwischenzuspeichern?

Kurz habe ich eineNSDictionary mit URLs für Bilder, die ich in meinem anzeigen mussUITableView. Jede Zelle hat einen Titel und ein Bild. Ich hatte dies erfolgreich umgesetzt, obwohl das Scrollen verzögert war, da es den Anschein hatte, als hätten die Zellen ihr Bild jedes Mal heruntergeladen, wenn sie auf den Bildschirm kamen. Ich suchte ein bisschen und fandSDWebImage auf Github. Dies ließ das Scroll-Lagg verschwinden. Ich bin nicht ganz sicher, was es getan hat, aber ich glaubte, dass es etwas Caching getan hat. Aber! Jedes Mal, wenn ich die App zum ersten Mal öffne, sehe ich KEINE Bilder, und ich muss nach unten scrollen und wieder nach oben, damit sie eintreffen. Und wenn ich die App mit der Home-Taste beende und wieder öffne, scheint das Caching zu funktionieren, da die Bilder auf dem Bildschirm sichtbar sind. Wenn ich jedoch eine Zelle nach unten scrolle, hat die nächste Zelle kein Bild. Bis ich daran vorbeirolle und wieder zurückkehre oder wenn ich darauf klicke. Soll das Caching so funktionieren? Oder wie lassen sich aus dem Internet heruntergeladene Bilder am besten zwischenspeichern? Die Bilder werden momentan aktualisiert, daher wollte ich sie gerade in das Projekt importieren, aber ich möchte die Möglichkeit haben, Bilder zu aktualisieren, ohne ein Update hochzuladen.

Ist es unmöglich, beim Start alle Bilder für die gesamte Tabellenansicht aus dem Cache zu laden (vorausgesetzt, der Cache enthält etwas)? Sehe ich deshalb manchmal Zellen ohne Bilder?

Und ja, es fällt mir schwer zu verstehen, was Cache ist.

--BEARBEITEN--

Ich habe dies nur mit Bildern der gleichen Größe (500x150) versucht, und der Aspektfehler ist verschwunden. Wenn ich jedoch nach oben oder unten scrolle, befinden sich Bilder auf allen Zellen, aber zuerst sind sie falsch. Nachdem die Zelle einige Millisekunden in der Ansicht war, wird das rechte Bild angezeigt. Das ist erstaunlich ärgerlich, aber vielleicht muss es so sein? Es sieht so aus, als ob es zuerst den falschen Index aus dem Cache auswählt. Wenn ich langsam scrolle, kann ich sehen, dass die Bilder vom falschen zum richtigen Bild blinken. Wenn ich schnell scrolle, dann glaube ich, dass immer die falschen Bilder sichtbar sind, aber ich kann es aufgrund des schnellen Scrollens nicht sagen. Wenn der schnelle Bildlauf langsamer wird und schließlich angehalten wird, werden immer noch die falschen Bilder angezeigt. Sobald der Bildlauf jedoch angehalten wird, werden die richtigen Bilder aktualisiert. Ich habe auch einen BrauchUITableViewCell Klasse, aber ich habe keine großen Änderungen vorgenommen. Ich habe meinen Code noch nicht sehr viel durchgearbeitet, aber ich kann mir nicht vorstellen, was möglicherweise falsch ist. Vielleicht habe ich etwas in der falschen Reihenfolge programmiert viel in Java, C #, PHP usw., aber ich habe Schwierigkeiten, Objective-C zu verstehen, mit all den.h und.m Ich habe auch

@interface FirstViewController : UITableViewController{

/**/
NSCache *_imageCache;
}

(unter anderen Variablen) inFirstViewController.h. Ist das nicht richtig?

Hier ist meinscellForRowAtIndexPath.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"hallo";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

NSMutableArray *marr = [hallo objectAtIndex:indexPath.section];
NSDictionary *dict = [marr objectAtIndex:indexPath.row];

NSString* imageName = [dict objectForKey:@"Image"];
//NSLog(@"url: %@", imageURL);

UIImage *image = [_imageCache objectForKey:imageName];

if(image)
{
    cell.imageView.image = image;
}
else
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSString* imageURLString = [NSString stringWithFormat:@"example.com/%@", imageName];
        NSURL *imageURL = [NSURL URLWithString:imageURLString];
        UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]];

        if(image)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                CustomCell *cell =(CustomCell*)[self.tableView cellForRowAtIndexPath:indexPath];
                if(cell)
                {
                    cell.imageView.image = image;
                }
            });
            [_imageCache setObject:image forKey:imageName];
        }
    });
}

cell.textLabel.text = [dict objectForKey:@"Name"];

return cell;
}

Antworten auf die Frage(7)

Ihre Antwort auf die Frage