Xcode: lazy loading von Bildern von den image-Daten in core data

HINWEIS: ich bin mit der ARC

Habe ich eine lazy image loading-Technik, die hervorragend funktioniert, wenn das laden von Bildern von einer web-url. Aber ich habe Probleme beim laden von Bildern, die von core data. Hier ist die Methode, die ich benutze:

Ich zum ersten alloc init meinen mutable arrays, laden meine Daten aus dem core data und dann speichern Sie in einem array. Dann habe ich diesen code:

NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                    initWithTarget:self
                                    selector:@selector(loadImage)
                                    object:nil];
[queue addOperation:operation];

Und dann...

- (void)loadImage {
    for (int i = 0; i < [myArrayFromCoreData count]; i++) {
        AnObject *myObject = [myArrayFromCoreData objectAtIndex:i];
        UIImage* image;
        if ([myObject.image length] == 0) {
            image = [UIImage imageNamed:@"default.png"];
        }
        else {
            image = [[UIImage alloc] initWithData:myObject.image];
        }
        [self performSelectorOnMainThread:@selector(displayImage:) withObject:[NSArray arrayWithObjects:image,myObject.myObjectId, nil] waitUntilDone:NO];
    }
}

- (void)displayImage:(NSArray*)array {
    [loadedImages setObject:[array objectAtIndex:0] forKey:[array objectAtIndex:1]];
    [self.myTable reloadData];
}

Hier gibt es keine Verzögerung und ein NSLog zeigt, dass alle meine Bilder sind Hinzugefügt, um die myObjectLoadedImages array.

Das problem, das ich habe ist, dass es eine Verzögerung beim scrollen der Tabelle angezeigt und es manchmal zu einem Absturz führen. Hier ist der code, den ich benutze, um die Anzeige der geladenen Bilder:

UIImage* image = [loadedImages objectForKey:myObject.myObjectId];
if (image != NULL) {
    myImageView.image = image;
}
else {
    myImageView.image = [UIImage imageNamed:@"default.png"];
}

Dies ist in der cellForRowAtIndexPath Methode so es wird jedesmal aufgerufen, wenn die Zelle angezeigt wird. Gibt es etwas, was ich falsch mache hier mein code, der angepasst ist, von einer Klasse, die ist in Ordnung, das laden von Bildern von einer web-url.

Wird der code nicht angezeigt, um offensichtliche Fehler. Das heißt, man könnte ein mutable dictionary zum speichern der Bilder, mit der objectID, wie der Schlüssel und das Bild als Daten - das wäre wirklich reduzieren auf die Menge an code, ohne änderung der Funktionalität. Ich denke, du solltest post uyour ganze cellForRowAtIndexPath und angeben, ob Sie mit der ARC oder nicht. Auch das laden der ganzen Tabelle für einfach nur ein neues Bild ist wirklich ineffizient - Sie sollten herausfinden, was sichtbare Zelle aktualisiert werden muss und genau das zu tun.
Tolle Ratschläge, verwenden Sie ein NSMutableDictionary! Machte es 50% besser. Nun einmal die Bilder einmal geladen, ist es glatt. Aber es ist immer noch langsam, die ersten Bilder sind geladen in der tableviewcell

InformationsquelleAutor Patrick | 2012-08-07

Schreibe einen Kommentar