0

i am using table view to display image fron internet and its taking time to load the image..

i tried

 dispatch_async(imageQueue_, ^{
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[record imageURLString]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [[cell imageView] setImage:[UIImage imageWithData:imageData]];
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
    });

but its loading image slowly and repeating the images till the other images will load in the same row.. is there any way to load all the images in tableview at same time (normally it will happen one by one..)?

Raju
  • 441
  • 1
  • 6
  • 17

3 Answers3

1

Make 2 class with AsyncImageView.h and .m

In AsyncImageView.h

@interface AsyncImageView : UIView 
{
    NSURLConnection *connection;
    NSMutableData *data;
    NSString *urlString; // key for image cache dictionary
}

-(void)loadImageFromURL:(NSURL*)url;
- (void)StoreImage:(UIImage*)image String:(NSString *)str;
@end

and In .m

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


- (void)drawRect:(CGRect)rect 
{
    // Drawing code
}


- (void)dealloc 
{
    [connection cancel];
    [connection release];
    [data release];
    [super dealloc];
}

-(void)loadImageFromURL:(NSURL*)url 
{
    if (connection != nil) 
    {
        [connection cancel];
        [connection release];
        connection = nil;
    }
    if (data != nil) 
    {
        [data release];
        data = nil;
    }

    if (imageCache == nil) // lazily create image cache
        imageCache = [[ImageCache alloc] initWithMaxSize:2*1024*1024];  // 2 MB Image cache

    [urlString release];
    urlString = [[url absoluteString] copy];
    UIImage *cachedImage = [imageCache imageForKey:urlString];
    if (cachedImage != nil) {
        if ([[self subviews] count] > 0) 
        {
            [[[self subviews] objectAtIndex:0] removeFromSuperview];
        }
        UIImageView *imageView = [[[UIImageView alloc] initWithImage:cachedImage] autorelease];
        imageView.contentMode = UIViewContentModeScaleAspectFill;
        imageView.autoresizingMask = 
            UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [self addSubview:imageView];
        imageView.frame = self.bounds;
        [imageView setNeedsLayout]; // is this necessary if superview gets setNeedsLayout?
        [self setNeedsLayout];
        return;
    }

#define SPINNY_TAG 5555   

    UIActivityIndicatorView *spinny = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinny.backgroundColor=[UIColor whiteColor];
  //  spinny.tag = SPINNY_TAG;
  //  spinny.center = self.center;
    [spinny startAnimating];
    [self addSubview:spinny];
    [spinny release];

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)incrementalData 
{
    if (data==nil) 
    {
        data = [[NSMutableData alloc] initWithCapacity:2048];
    }
    [data appendData:incrementalData];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection 
{
    [connection release];
    connection = nil;

    UIView *spinny = [self viewWithTag:SPINNY_TAG];
    [spinny removeFromSuperview];
    if ([[self subviews] count] > 0) 
    {
        [[[self subviews] objectAtIndex:0] removeFromSuperview];
    }
    UIImage *image = [UIImage imageWithData:data];
    [imageCache insertImage:image withSize:[data length] forKey:urlString];
    UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self addSubview:imageView];
    imageView.frame = self.bounds;
    [imageView setNeedsLayout]; 
    [self setNeedsLayout];
    [data release];
    data = nil;
}

And in your class where you are displaying tableview just import AsyncImageView.h and in tableView cellForRowAtIndexPath write

    AsyncImageView *asyncImageView = nil;

    UIImageView *cellImage = (UIImageView *)[cell viewWithTag:1];
    asyncImageView = [[AsyncImageView alloc] initWithFrame:cellImage.frame] ;
    [asyncImageView loadImageFromURL:YourImageURL];
    asyncImageView.backgroundColor=[UIColor clearColor]; 
    [cell.contentView addSubview:asyncImageView];

I have used it and works fine. Hope it'll work for you also.. :)

Shah Paneri
  • 729
  • 7
  • 28
0

As Eugene mentioned, use SDWebImage. Makes this stuff so simple.

ozz
  • 1,137
  • 7
  • 9
0

You load images lazily to the tableview. Here is the Great Example by Apple.

User-1070892
  • 929
  • 10
  • 16