• 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 <ICTableViewDelegate> ICTableVieDelegate;
        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
    {//拖拽之后 完毕减速时运行停止滚动时启动缓存载入图片进程
        
        if (!tableView.isDragging && !tableView.isDecelerating)
        {
            [self performSelectorInBackground:@selector(loadCellImage) withObject:nil];
        }
    }
    
    #pragma mark - Scroll View delegate
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {拖拽之后 完毕减速时运行启动缓存载入图片进程
    
        [self performSelectorInBackground:@selector(loadCellImage) withObject:nil];
    }
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    {//停止滚动时要运行的代码
        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];
        }
    
        
       
    



  • 相关阅读:
    linux CGI GET POST 用户登录
    linux内核 简化版ksetexample.c解析
    定制.vimrc配置文件
    procfs信息读取实现案例
    基于Extent 的文件存储(fiemap)
    inode_operations介绍
    Linux 文件系统概述
    linux硬链接与软连接的区别
    procfs读写信息实例
    VC 常见问题百问 20080129 13:37 271人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5315451.html
Copyright © 2020-2023  润新知