Beste Weg, um cache-Bilder auf ios-app?

Kurz, ich habe eine NSDictionary mit urls für die Bilder, die ich brauche, um zu zeigen, in meinem UITableView. Jede Zelle hat einen Titel und ein Bild. Ich hatte erfolgreich das passieren, obwohl das scrollen war hinterher, als es schien, dass die Zellen heruntergeladen Ihr Bild jedes mal kamen Sie in den Bildschirm.
Ich suchte ein bisschen und fand SDWebImage auf github. Dies machte die scroll-lagg Weg. Ich bin nicht ganz sicher, was es Tat, aber ich glaubte, es habe einige caching.
Aber! Jedes mal, wenn ich öffnen Sie die app zum ersten mal, ich sehe KEINE Bilder, und ich muss scrollen Sie nach unten, und back-up für Sie, um anzukommen. Und wenn ich die app beenden mit der home-Taste, und öffnen Sie wieder, dann ist es seemes wie das caching funktioniert, weil die Bilder auf dem Bildschirm sichtbar sind, jedoch, wenn ich gehe eine Zelle nach unten, dann die nächste Zelle hat kein Bild. Bis ich scrollen Sie vorbei und sichern, oder wenn ich drauf klicke. Ist dies, wie der Cache funktionieren soll? Oder was ist der beste Weg, um cache-Bilder aus dem Internet heruntergeladen? Die Bilder werden laufend aktualisiert, sind rarily, also ich war in der Nähe, nur importieren Sie Sie auf das Projekt, aber ich möchte die Möglichkeit haben, zu aktualisieren, Bilder hochladen ohne ein update..

Ist es unmöglich zum laden der Bilder für die gesamte tableview form der cache(gegeben, dass es etwas in den cache) zu starten? Das ist, warum ich manchmal sehen, Zellen ohne Bilder?

Und ja, ich habe eine harte Zeit zu verstehen, was cache ist.

--EDIT--

Habe ich versucht, diese mit nur Bilder der gleichen Größe (500x150), und das aspect-Fehler ist Weg, aber wenn ich nach oben oder unten scrollen, dort sind-Bilder auf allen Zellen, aber Erstens sind Sie falsch. Nachdem die Zelle wurde in der Ansicht für einige Millisekunden, das richtige Bild wird angezeigt. Das ist unglaublich ärgerlich, aber vielleicht, wie es sein muss?.. Es seemes wie er wählt die falsche index aus dem cache auf den ersten. Wenn ich einen Bildlauf langsam ist, dann sehe ich die Bilder blinken vom falschen Bild, die richtigen sind. Wenn ich schnell Rollen, dann glaube ich, die falschen Bilder sind jederzeit sichtbar, aber ich kann nicht sagen, aufgrund der schnellen scrollen. Wenn der schnelle Bildlauf verlangsamt und schließlich Stoppt, die falschen Bilder immer noch angezeigt werden, aber sofort, nachdem es nicht scrollen, es updates zu den richtigen Bildern. Ich habe auch eine benutzerdefinierte UITableViewCell Klasse, aber ich habe nicht große Veränderungen.. ich habe nicht gegangen durch meinen code sehr viel noch, aber ich kann nicht glauben, was falsch sein kann.. Vielleicht habe ich irgendwas in der falschen Reihenfolge.. ich habe viel programmiert in java, c#, php etc, aber ich habe eine harte Zeit zu verstehen, Objective-c, mit allen .h und .m ...
Ich habe auch `

@interface FirstViewController : UITableViewController{

/**/
NSCache *_imageCache;
}

(neben anderen Variablen) in FirstViewController.h. Ist diese nicht korrekt?

Hier mein cellForRowAtIndexPath.

- (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;
}

InformationsquelleAutor der Frage Sti | 2012-07-16

Schreibe einen Kommentar