innhyul

Between tomorrow's dream and yesterday's regret is todays opportunity.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转]如何异步加载图片等数据

大致思路为两步:(1) 加载tableView时读取图片缓存,如果存在则显示,如果不存在则异步下载;(2) 下载图片信息成功,更新图片缓存,重新加载tableView的数据

 

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

    /* 其他代码 */
 
    // 用户头像
    UIImage *userPic = [self cachedImageForUrl:[NSURL URLWithString:url]];
    cell.userPicView.image = userPic;
 
    /* 其他代码 */
}
 
- (UIImage *)cachedImageForUrl:(NSURL *)url {
    id cachedObject = [self.cachedImage objectForKey:url];
    if (cachedObject == nil) {
        //防止reloadData时重复提交请求,添加占位符
        [self.cachedImage setObject:@"Loading..." forKey:url];
        //异步下载图片
        ASIHTTPRequest *picRequest = [ASIHTTPRequest requestWithURL:url];
        picRequest.delegate = self;
        picRequest.didFinishSelector = @selector(didFinishRequestImage:);
        picRequest.didFailSelector   = @selector(didFailRequestImage:);
        [self.queue addOperation:picRequest];
        // 更新状态栏的网络标示
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    }else if ( ![cachedObject isKindOfClass:[UIImage class]] ) {
        cachedObject = nil;
    }
    return cachedObject;
}
 
- (void)didFinishRequestImage:(ASIHTTPRequest *)request {
    NSData *imageData = [request responseData];
    UIImage *image = [UIImage imageWithData:imageData];
    if (image != nil) {
        [self.cachedImage setObject:image forKey:request.url];
        [self.tableView reloadData];
    }
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
 
- (void)didFailRequestImage:(ASIHTTPRequest *)request {
    NSLog(@"Error Download Image: %@", request.error);
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
posted on 2010-10-28 11:17  bufferi  阅读(155)  评论(0)    收藏  举报