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?

10voto

rohan-patel Punkte 5761

Ja, Sie können andere Bibliotheken verwenden. Ich habe das bereits implementiert mit AsyncImageView die geerbt wird von UIImageView . Was es tut, ist es speichert Bilder im Cache-Speicher von einer Url geholt und wann immer Sie brauchen, um Bild aus dem laden dieselbe URL wird sie einfach aus dem Cache-Speicher geladen, was viel Zeit spart.

Folgen Sie einfach dem Link, um das zu implementieren:

https://github.com/nicklockwood/AsyncImageView#readme

http://www.markj.net/iphone-asynchronous-table-image/

Bitte sehen Sie sich das Bild an, das die von mir angewandte Technik zeigt. Damit können Sie andere Aktivitäten durchführen, während die Bilder geladen werden..:

enter image description here

6voto

rickster Punkte 121640

NSURLConnection ermöglicht asynchrones Herunterladen und ist in iOS integriert.

4voto

LuisEspinoza Punkte 8498

Ich denke, dass der Fehler, den Sie beschreiben, auftreten kann, weil wenn Sie "zurückgehen" einige Objekte freigeben, die Delegierte von Verbindungen sein können, die noch laufen. Um Abstürze zu vermeiden, sollten Sie die Verbindungen vor der Freigabe abbrechen oder alle Objekte, die Delegierte einer laufenden Verbindung sein könnten, freigeben.

Eine weitere Alternative für den asynchronen Download von Bildern ist http://allseeing-i.com/ASIHTTPRequest/ .

4voto

Stanley Tang Punkte 258

Ich persönlich verwende die in iOS integrierte Funktion Grand Central Dispatch, um Bilder asynchron vom Server herunterzuladen.

Nachfolgend finden Sie einen Code, mit dem ich in einer meiner Anwendungen Fotos von Flickr abgerufen habe.

Erstellen Sie in Ihrer Bild-/Fotoklasse eine Funktion, die in etwa so aussieht:

- (void)processImageDataWithBlock:(void (^)(NSData *imageData))processImage
{
NSString *url = self.imageURL;
dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Photo Downloader", NULL);
dispatch_async(downloadQueue, ^{
    NSData *imageData = *insert code that fetches photo from server*;
    dispatch_async(callerQueue, ^{
        processImage(imageData);
    });
});
dispatch_release(downloadQueue);
}

In Ihrem Photo View Controller können Sie diese Funktion wie folgt aufrufen:

- (void)viewWillAppear:(BOOL)animated
{
[spinner startAnimating];
[self.photo processImageDataWithBlock:^(NSData *imageData) {
    if (self.view.window) {
        UIImage *image = [UIImage imageWithData:imageData];
        imageView.image = image;
        imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
        scrollView.contentSize = image.size;
        [spinner stopAnimating];
    }
}];
}

2voto

Kuldeep Punkte 2589
//JImage.h

#import <Foundation/Foundation.h>

@interface JImage : UIImageView {

    NSURLConnection *connection;

    NSMutableData* data;

    UIActivityIndicatorView *ai;
}

-(void)initWithImageAtURL:(NSURL*)url;  

@property (nonatomic, retain) NSURLConnection *connection;

@property (nonatomic, retain) NSMutableData* data;

@property (nonatomic, retain) UIActivityIndicatorView *ai;

@end

//JImage.m

#import "JImage.h"

@implementation JImage
@synthesize ai,connection, data;

-(void)initWithImageAtURL:(NSURL*)url {

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    [self setContentMode:UIViewContentModeScaleToFill];

    if (!ai){

        [self setAi:[[UIActivityIndicatorView alloc]   initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]]; 

        [ai startAnimating];

        [ai setFrame:CGRectMake(27.5, 27.5, 20, 20)];

        [ai setColor:[UIColor blackColor]];

        [self addSubview:ai];
    }
    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];

    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];    
}

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {

if (data==nil) data = [[NSMutableData alloc] initWithCapacity:5000];

[data appendData:incrementalData];

NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[data length]];

NSLog(@"resourceData length: %d", [resourceLength intValue]);

}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{
    NSLog(@"Connection error...");

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    [ai removeFromSuperview];

}
- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection 
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    [self setImage:[UIImage imageWithData: data]];

    [ai removeFromSuperview];   
}
@end

//Include the definition in your class where you want to use the image
-(UIImageView*)downloadImage:(NSURL*)url:(CGRect)frame {

JImage *photoImage=[[JImage alloc] init]; 

    photoImage.backgroundColor = [UIColor clearColor]; 

   [photoImage setFrame:frame];

   [photoImage setContentMode:UIViewContentModeScaleToFill]; 

    [photoImage initWithImageAtURL:url];

    return photoImage;
}

//How to call the class

UIImageView *imagV=[self downloadImage:url :rect]; 

//you can call the downloadImage function in looping statement and subview the returned  imageview. 
//it will help you in lazy loading of images.

//Hope this will help

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