我正在开发一个具有多个表视图的iPhone应用程序。在每个UITableview
我必须加载RSS提要数据。每个Feed都有自己的图像。
对于单个feed,我尝试解析xml并在委托本身内加载图像。
任何人都可以建议我如何为所有Rss Feed视图实现延迟加载吗?
答案 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;
}