samir
samir

Reputation: 4551

download multiple images with ASIHttpRequest

I have a UITableView which contain several cell. When I click a cell, I push an other controller which shows the detail of this cell. In the detail I have a scrollView which contains several UIImageViews. I would like to download the images for these views from the web using ASIHTTPRequest, when the detail view is loaded.

Upvotes: 3

Views: 3099

Answers (2)

xda1001
xda1001

Reputation: 2459

You can override UIView. Each view has an ASIHTTPRequest. When each download has finished, you can use drawRect to draw the downloaded image.

this is a demo:

MyImageView.h

#import <UIKit/UIKit.h>

#import "ASIHTTPRequest.h"

@interface MyImageView : UIView <ASIHTTPRequestDelegate>
{
    ASIHTTPRequest *httpRequest;
    UIImage *image;
}

- (void)startRequest:(NSString *)_url;
@end

MyImageView.m

#import "MyImageView.h"

@implementation MyImageView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    // Drawing code
    if (image != nil) {
        [image drawInRect:self.bounds];
    }

}

- (void)dealloc
{
    [httpRequest clearDelegatesAndCancel];
    [httpRequest release];
    [image release];

    [super dealloc];
}


-(void)startRequest:(NSString *)_url
{
    if (httpRequest != nil) {
        [httpRequest clearDelegatesAndCancel];
        [httpRequest release];
    }

    httpRequest = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:_url]];
    [httpRequest setTimeOutSeconds:30];

    [httpRequest setDelegate:self];
    [httpRequest startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    if ([request responseStatusCode] == 200) {
        image = [[UIImage alloc] initWithData:[request responseData]];
        [self setNeedsDisplay];
    }
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSLog(@"request failed");
}

Usage:

MyImageView *imageView = [[MyImageView alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
[imageView startRequest:@"http://imageUrl"];
[self.view addSubview:imageView];
[imageView release];

Upvotes: 4

JosephH
JosephH

Reputation: 37495

Here's a class derived from UIImageView:

Header file, UIHTTPImageView.h:

#import "ASIHTTPRequest.h"

@interface UIHTTPImageView : UIImageView {
    ASIHTTPRequest *request;
}

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;

@end

and UIHTTPImageView.m:

#import "UIHTTPImageView.h"

@implementation UIHTTPImageView        

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder {
    [request setDelegate:nil];
    [request cancel];
    [request release];

    request = [[ASIHTTPRequest requestWithURL:url] retain];
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

    if (placeholder)
        self.image = placeholder;

    [request setDelegate:self];
    [request startAsynchronous];
}

- (void)dealloc {
    [request setDelegate:nil];
    [request cancel];
    [request release];
    [super dealloc];
}

- (void)requestFinished:(ASIHTTPRequest *)req
{

    if (request.responseStatusCode != 200)
        return;

    self.image = [UIImage imageWithData:request.responseData];
}

@end

Note that there's no reporting of errors, you may want an requestFailed: method if you want to report a problem to the user.

Upvotes: 1

Related Questions