大致思路为两步:(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; } |
本文介绍了一种在UITableView中高效加载图片的方法,通过缓存已加载的图片并在加载新图片时使用异步下载来提升用户体验。该方法首先尝试从缓存中获取图片,若缓存中没有,则异步下载并更新缓存。
1万+

被折叠的 条评论
为什么被折叠?



