4 Stimmen

Bild asynchron herunterladen

Ich muss ein Bild aus dem Internet herunterladen und es in einem ImageView . Zurzeit verwende ich SDWebImage (Es ist ein asynchroner Bild-Downloader mit Cache-Unterstützung, mit einem UIImageView Kategorie).

Aber es stürzt ab, wenn ich auf die Schaltfläche "Zurück" und "Vorwärts" klicke (wenn ich versuche, wiederholt in der Ansicht hin und her zu wechseln). Wie auch immer, dies geschieht sehr selten, aber ich muss diesen Fehler loswerden. Gibt es eine andere Bibliothek (die nicht private APIs verwendet), die ich in meinem Projekt verwenden könnte?

2voto

Manish Agrawal Punkte 10870

Überprüfen Sie EGOImageLoading von enormego zum Zwischenspeichern von Bildern. Es funktioniert genau wie UIImageView und lässt Sie Bilder von HTTP asynchron herunterladen und auch seine einfach zu integrieren

1voto

Simon Punkte 751

Ich weiß, dies ist ein sehr altes Thema, aber vor kurzem hatte ich eine Menge von zufälligen Abstürzen mit SDWebImage, so musste ich meine eigenen Lazy Loading und Caching-Mechanismus zu implementieren. Es funktioniert ziemlich gut, ich habe es nur nicht in schweren Lastfällen getestet. Hier sind die .h und .m Dateien, gefolgt von der Art und Weise, wie ich es benutze:

//  UIImageView+CustomCache.h
@interface UIImageView(CustomCache)

-(void)startAsyncDownload:(UIImage*)placeHolderImage imageUrlString:(NSString*)imageUrlString;
@end

//  UIImageView+CustomCache.m

#import "UIImageView+CustomCache.h"

@implementation UIImageView(CustomCache)

-(void)startAsyncDownload:(UIImage*)placeHolderImage imageUrlString:(NSString*)imageUrlString{
    self.image = placeHolderImage;
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:
                                              [NSURL URLWithString:imageUrlString]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionHandler){
        @autoreleasepool {
            if (connectionHandler != nil) {
                NSLog(@"error in downloading description %@",connectionHandler.localizedDescription);
            } else {
                ImagesCacheHandler *ref = [ImagesCacheHandler new];
                UIImage *imageFromData = [[UIImage alloc] initWithData:data];
                if (imageFromData != NULL && imageFromData != nil && data.length > 0) {
                    self.image = imageFromData;
//custom store to sqlite
                    [ref archiveImage:imageUrlString imageData:data moc:[ref fetchContext]];
                }
            }
        }
    }];
}

@end

Und in meiner Tabelle Ansicht ich verwenden (ich importieren natürlich UIImageView+CustomCache.h)

UIImageView *imageViewToLazyLoad = (UIImageView*)[cell viewWithTag:1];
[imageViewToLazyLoad startAsyncDownload:[UIImage imageNamed@"palce_Holder_Image_name"] imageUrlString:imageUrl];

0voto

axe Punkte 27

Ich persönlich bevorzuge die Verwendung von NSURLConnection sendSynchronousRequest und setze einen GCD-Wrapper darum. Hält alles ordentlich und aufgeräumt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X