使用延迟加载为多个UITableView加载图像

时间:2010-07-17 19:02:30

标签: iphone lazy-loading objective-c

我正在开发一个具有多个表视图的iPhone应用程序。在每个UITableview我必须加载RSS提要数据。每个Feed都有自己的图像。

对于单个feed,我尝试解析xml并在委托本身内加载图像。

任何人都可以建议我如何为所有Rss Feed视图实现延迟加载吗?

2 个答案:

答案 0 :(得分:3)

Apple的这个示例项目应该可以帮助您实现这一目标。

http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Introduction/Intro.html

答案 1 :(得分:0)

我为矿山项目创作的内容如下; 按“UITableViewCell + Async.h”中的类别扩展UITableViewCell类 (如果您不确定Obj C中的类别是什么,请参阅一些示例)

@interface UITableViewCell (Async)

-(void)loadAsyncImage:(NSString*)url withIndex:(NSInteger)index inWidth:(NSInteger)width inHeight:(NSInteger)height;
-(void)loadAsyncBackground:(NSMutableArray*)parameters;

@end

然后在实现文件“UITableViewCell + Async.m”

#import "UITableViewCell+Async.h"

@implementation UITableViewCell (Async)

-(void)loadAsyncImage:(NSString*)url 
            withIndex:(NSInteger)index 
              inWidth:(NSInteger)width 
             inHeight:(NSInteger)height {

    NSMutableArray* parameters = [NSMutableArray arrayWithCapacity:2];
    [parameters addObject:url];
    [parameters addObject:[NSNumber numberWithInteger:index]];
    [parameters addObject:[NSNumber numberWithInteger:width]];
    [parameters addObject:[NSNumber numberWithInteger:height]];

    self.imageView.tag = index;
    [self performSelectorInBackground:@selector(loadAsyncBackground:) withObject:parameters];

}

-(void)loadAsyncBackground:(NSMutableArray*)parameters {
    FootPrint
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString* url = [parameters objectAtIndex:0];
    NSInteger index = [[parameters objectAtIndex:1] integerValue];
    NSInteger width = [[parameters objectAtIndex:2] integerValue];
    NSInteger height = [[parameters objectAtIndex:3] integerValue];

    UIImage* image = [Utils getImageResized:url inSize:CGSizeMake(width, height)];

    if (self.tag==index) {
        self.imageView.image = image;
        [self setNeedsLayout];
    }

    [pool release];
}

@end

这基本上为UITableViewCell添加了一个功能,用于在新的后台线程中加载图像,调整图像大小并将其设置为imageview。添加检查标签以查看单元格是否仍在等待图像,因为它可以重复使用,而图像的另一个线程可能正在为该重用单元格下载另一个图像......

上述代码中的函数,签名为;

+(UIImage*)getImageResized:(NSString*)url inSize:(CGSize)size;

检查图像的本地缓存,如果不在缓存中,则从Web下载图像,将其保存到本地缓存,调整给定大小的图像大小并返回图像,所有这些都在同步(阻塞)方法调用中完成。由于这已经是后台线程,因此对此操作没有任何伤害。当方法返回图像时,如果它仍具有相同的标记(不再用于其他行),则将其设置为单元格的imageview

在cellForRowAtIndexPath方法中,您可以添加新类别,您应该完成;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"......."];
    if (cell == nil) {
................
    }
................
    [cell loadAsyncImage:deal.logo withIndex:indexPath.row inWidth:40 inHeight:40];
................

    return cell;
}