iOS tableView的图片缓存异步加载

1.建立一个viewController.

.h文件实现UIScrollViewDelegate和UITableViewDelegate,并声明ICTableViewDelegate(用来实现图片有缓存则加载图片,无缓存则请求图片并缓存下来再加载)
.h文件如下
#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

.m文件如下:

- (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;



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。