大致思路为两步:(1) 加载tableView时读取图片缓存,如果存在则显示,如果不存在则异步下载;(2) 下载图片信息成功,更新图片缓存,重新加载tableView的数据
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | - (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; } |