Async Image下载UITableView的cellForRowAtIndexPath并不总是被调用

时间:2011-06-24 11:36:14

标签: objective-c ios

我使用Apple的LazyTableImages示例为UITableViewCells异步下载图像。主要区别在于我将文件的副本保存到Documents文件夹,因此无需一直下载。下面的方法由负责下载图像的类调用

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

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

当图像不在设备上时,下载正常并显示图像。但是,当图像在设备上时,图像不会显示,并且单元格变量为空。

AsyncImage的代码是:

//
//  AsyncImgView.m
//  BelfastChamberOfCommerce
//
//  Created by markpirvine 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

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

我建议使用其中一个开源类来同步下载内置支持缓存的图像。我正在使用的是cached image for iOS