iOS tableView的图片缓存异步加载
1.建立一个viewController.
#define KimageKey @"photoFileUrl" ///为数组中每个item中存放图片URL的key名字 #define KidKey @"activityId" ///为数组中每个item的id 用于缓存之用 #import <UIKit/UIKit.h> @protocol ICTableViewDelegate @required -(void)cellImageDidLoad:(NSIndexPath *)indexPath image:(NSMutableArray *)imageArray; @end @interface ICTableViewController : UIViewController <UIScrollViewDelegate,UITableViewDelegate> { @public id <WQTableViewDelegate> WQTableVieDelegate; NSMutableArray *tableDataArray; UITableView *wqTable; } @end
- (void)loadCellImage {//方法实现实现图片有缓存则加载图片,无缓存则请求图片并缓存下来再加载 NSArray *indexPathsForLoad = [wqTable indexPathsForVisibleRows]; for (NSIndexPath *item in indexPathsForLoad) { NSInteger rowNumberForCell = item.row; NSLog(@"%li",(long)rowNumberForCell); NSLog(@"%li",(unsigned long)[tableDataArray count]); if (rowNumberForCell >[tableDataArray count] -1) { return; } NSString *imageStr =tableDataArray[rowNumberForCell][@"photoFileUrl"]; NSLog(@"%@",imageStr); NSMutableArray *imageArray = [NSMutableArray array]; if([imageStr length]!=0){ NSArray *photoUrl = [imageStr componentsSeparatedByString:MULTI_FILES_SEPARATOR]; for(int i=0;i<photoUrl.count -1;i++){ //显示图片 NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[NSString stringWithFormat:@"%@/%@%@",[WiseApplicationViewController getImgBucketDomain],[WiseApplicationViewController getOrganizationId],photoUrl[i]] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]]; NSString *imageName = [tableDataArray[rowNumberForCell][KimageKey] stringByAppendingString:[NSString stringWithFormat:@".temp"]]; NSString *imageDataPath = [NSHomeDirectory() stringByAppendingPathComponent:[@"Library/Caches/" stringByAppendingString:imageName]]; if (![[NSFileManager defaultManager] fileExistsAtPath:imageDataPath]) { [imageData writeToFile:imageDataPath atomically:YES]; UIImage *image = [UIImage imageWithData:imageData]; [imageArray addObject:image]; } } [ICTableVieDelegate cellImageDidLoad:item image:imageArray]; } } } #pragma mark - Table View delegate -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {//<span style="font-family: 'Courier New'; white-space: pre-wrap; background-color: rgb(245, 245, 245); margin: 0px; padding: 0px; line-height: 1.5 !important;">拖拽</span><span style="line-height: 19px; white-space: pre-wrap; font-family: Arial, Helvetica, sans-serif;">tableView</span><span style="font-family: 'Courier New'; white-space: pre-wrap; background-color: rgb(245, 245, 245); margin: 0px; padding: 0px; line-height: 1.5 !important;">之后 完成减速时执行</span><span style="line-height: 19px; white-space: pre-wrap; font-family: Arial, Helvetica, sans-serif;">停止滚动时启动缓存加载图片进程</span> if (!tableView.isDragging && !tableView.isDecelerating) { [self performSelectorInBackground:@selector(loadCellImage) withObject:nil]; } } #pragma mark - Scroll View delegate - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {//<span style="font-family: 'Courier New'; white-space: pre-wrap; background-color: rgb(245, 245, 245); margin: 0px; padding: 0px; line-height: 1.5 !important;">拖拽<span style="background-color: rgb(240, 240, 240); line-height: 1.5;">Scroll</span><span style="background-color: rgb(240, 240, 240); line-height: 19px; font-family: Arial, Helvetica, sans-serif;">View</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">之后 完成减速时执行</span><span style="background-color: rgb(240, 240, 240); line-height: 19px; font-family: Arial, Helvetica, sans-serif;">启动缓存加载图片进程</span> </span> [self performSelectorInBackground:@selector(loadCellImage) withObject:nil]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {//<span style="color: rgb(51, 51, 51); font-family: Verdana, sans-serif, 宋体; font-size: 13px; letter-spacing: 0.5px; line-height: 22.5px;">停止滚动时要执行的代码</span> if (!decelerate) { [self performSelectorInBackground:@selector(loadCellImage) withObject:nil]; } }
然后具体子类继承这个父类,并实现ICTableViewDelegate代理方法
#pragma mark ICTableViewDelegate -(void)cellImageDidLoad:(NSIndexPath *)indexPath image:(NSMutableArray *)imageArray { EventShowTableViewCell *cell = (EventShowTableViewCell *)[_eventListTableView cellForRowAtIndexPath:indexPath]; if([imageArray count]!=0){ for(int i=0;i<imageArray.count;i++){ if (IS_IOS8_OR_LATER) { CustomPhotoBtn *photoBtn = (CustomPhotoBtn *)[cell.contentView viewWithTag:(i +1)*10]//<span style="font-family: Arial, Helvetica, sans-serif;">CustomPhotoBtn</span><span style="font-family: Arial, Helvetica, sans-serif;">加载图片封装的一个控件</span> UIImage *thumbImg = [FileTransferHelp thumbnailWithImage:(UIImage *)imageArray[i] size:CGSizeMake(60, 40)]; [photoBtn.imgView setImage:thumbImg]; [cell.contentView addSubview:photoBtn]; }else{ CustomPhotoBtn *photoBtn = (CustomPhotoBtn *)[cell.contentView viewWithTag:(i +1)*10]; UIImage *thumbImg = [FileTransferHelp thumbnailWithImage:(UIImage *)imageArray[i] size:CGSizeMake(60, 40)]; [photoBtn.imgView setImage:thumbImg]; [cell addSubview:photoBtn]; } } } }在子类设置每个cell的内容的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
里写下CustomPhotoBtn *photoBtn = [CustomPhotoBtn customPhotoBtn];//加载图片封装的一个控件 [photoBtn.fileFullName setText:url]; NSString *imageName = [url stringByAppendingString:[NSString stringWithFormat:@".temp"]]; NSLog(@"imageName%@",imageName); NSString *imageDataPath = [NSHomeDirectory() stringByAppendingPathComponent:[@"Library/Caches/" stringByAppendingString:imageName]]//从缓存中找图片 NSLog(@"imageDataPath%@",imageDataPath); // [data writeToFile:imageDataPath atomically:YES]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfFile:imageDataPath]]; UIImage *thumbImg = [FileTransferHelp thumbnailWithImage:image size:CGSizeMake(60, 40)]; if (thumbImg) { [photoBtn.imgView setImage:thumbImg]; } return photoBtn;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。