开发者

Async Image download a UITableView's cellForRowAtIndexPath not always called

开发者 https://www.devze.com 2023-03-15 08:16 出处:网络
I using Apple\'s LazyTableImages sample to async download images for UITableViewCells.The main difference is that I\'m saving a copy of the file to the Documents folder so that it doesn\'t need to be

I using Apple's LazyTableImages sample to async download images for UITableViewCells. The main difference is that I'm saving a copy of the file to the Documents folder so that it doesn't need to be downloaded all the time. The method below is called by the class responsible for downloading the image

- (void)imageDidLoad:(NSIndexPath *)indexPath
{
    AsyncImage *aImage = [imageDownloadsInProgress objectForKey:indexPath];
    if (aImage != nil) 
    {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:aImage.indexPathInTableView];

        cell.imageView.image = aImage.image;
    }
}

When the image is not on the device, the download goes fine and the image is displayed. However when the image is on the device the image is not displayed and the cell variable is null.

The code for the AsyncImage is:

//
//  AsyncImgView.m
//  BelfastChamberOfCommerce
//
//  Created by mark开发者_Go百科pirvine on 23/06/2011.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "AsyncImage.h"
#import "AppManager.h"

#define kAppIconHeight 48

@interface AsyncImage ()
@property (nonatomic, retain) NSString *fileUrl;
@end


@implementation AsyncImage

@synthesize imageUrl, fileUrl;
@synthesize image;
@synthesize indexPathInTableView;
@synthesize delegate;

- (void)dealloc
{
    [imageUrl release];
    [fileUrl release];
    [image release];
    [indexPathInTableView release];
    [connection cancel];
    [connection release];
    [data release];
    [super dealloc];
}

- (void)loadImage
{
    if (connection != nil)
    {
        [connection release];
    }

    if (data != nil)
    {
        [data release];
    }

    if([self.imageUrl length] > 0)
    {
        self.fileUrl = [[[AppManager sharedInstance] getCacheLocation] stringByAppendingPathComponent:[[self.imageUrl componentsSeparatedByString:@"/"] lastObject]];

        if([[NSFileManager defaultManager] fileExistsAtPath:self.fileUrl] == YES)
        {
            self.image = [UIImage imageWithContentsOfFile:self.fileUrl];

            [self deliverImage];
        }
        else
        {
            NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.imageUrl] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
            connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        }
    }
}

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

    [data appendData:incrementalData];
}

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

    UIImage *iTmp = [[UIImage alloc] initWithData:data];

    if (iTmp.size.width != kAppIconHeight && iTmp.size.height != kAppIconHeight)
    {
        CGSize itemSize = CGSizeMake(kAppIconHeight, kAppIconHeight);
        UIGraphicsBeginImageContext(itemSize);
        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
        [iTmp drawInRect:imageRect];
        self.image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    else
    {
        self.image = iTmp;
    }

    [UIImageJPEGRepresentation(self.image, 1.0) writeToFile:self.fileUrl atomically:YES];

    [iTmp release];

    [data release];
    data = nil;

    [self deliverImage];
}

- (void)deliverImage
{
    [delegate imageDidLoad:self.indexPathInTableView];
}

- (void)cancelDownload
{
    [connection cancel];
    connection = nil;
    data = nil;
}

@end

Any help would be greatly appreciated


I suggest using one of the open source classes for async download of images that has built-in support for caching. The one that I'm using is cached image for iOS.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号