[转]如何异步加载图片等数据
大致思路为两步:(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;}
浙公网安备 33010602011771号