zoukankan      html  css  js  c++  java
  • 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];
        }
    
        
       
    



  • 相关阅读:
    关于移动端点击后出现闪或者黑色背景
    :after伪类+content内容生成经典应用举例
    移动端(html5)微信公众号下用keyup实时监控input值的变化无效
    jquery-uploadify 上传
    SpringMvc 文件上传
    总结
    poi excel导入
    sencha 安装、学习
    sencha怎么在control层调用按钮
    sencha做个简单的登录界面
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5315451.html
Copyright © 2011-2022 走看看