• iOS如何获取网络图片(二)


    ios如何获取图片(二)无沙盒下

    解决问题

    *解决问题1:tableView滑动卡顿,图片延时加载
    解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI

    *解决问题2:反复请求网络图片,增加用户流量消耗
    解决方法:创建了downloadImage,downloadImage属于数据源,当tableview滚动的时候就可以给cell的数据赋值,运用了MVC设计方式

    *解决问题3:当没有请求到图片时,留白影响用户体验,图片还会延时刷新
    解决方法:添加默认图片

    *解决问题4:当该cell的网络请求未执行完,又滚动到了该cell,会导致网络请求重复
    解决方法:创建网络请求缓冲池

    *解决问题5:当出现数量较多的图片时,防止内存使用过多,耦合性大
    解决方法:创建图片缓冲池

    代码如下图

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        SXTShopCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    
        SXTShop * shop = self.dataList[indexPath.row];
    
        cell.shop = shop;
    
        //为了避免重复加载的问题,创建了downloadImage,downloadImage属于数据源,当tableview滚动的时候就可以给cell的数据赋值
    
        //从图片缓冲池里找到对应的图片
        if ([self.imageCache objectForKey:shop.shop_image]) {
        
        //如果下载过,直接从内存中获取图片
        cell.iconView.image = shop.downloadImage;
        cell.iconView.image = self.imageCache[shop.shop_image];
        
         } else {
        
            //设置默认图片
            cell.iconView.image = [UIImage imageNamed:@"defaultImage"];
        
            [self downloadImage:indexPath];
     
         }
    
    return cell;
    }
    
    - (void)downloadImage:(NSIndexPath *)indexPath {
    
        SXTShop * shop = self.dataList[indexPath.row];
    
        if ([self.operationDict objectForKey:shop.shop_image]) {
        
            NSLog(@"已经请求过了,请等待下载");
        
        } else {
            
        
            //如果未下载过,开启异步线程
            NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
            
                //模拟网络延时
                [NSThread sleepForTimeInterval:1];
            
            //通过url获取网络数据
                NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString                  stringWithFormat:@"%@%@",baseUrl,shop.shop_image]]];
            
                //将数据装换为图片
                UIImage * image = [UIImage imageWithData:data];
            
                //如果有图片
                if (image) {
                
                    //通知model,将图片赋值给downloadImage,以便下次从内存获取
                    //                    shop.downloadImage = image;
                
                    //将图片作为value,将url作为key
                   [self.imageCache setObject:image forKey:shop.shop_image];
                
                //获取主队列,更新UI
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    
                    //刷新第indexPath单元的表格
                    [self.tableView reloadRowsAtIndexPaths:@[indexPath]         withRowAnimation:UITableViewRowAnimationNone];
                    
                }];
            }
        }];
        
        //将请求加入操作缓冲池中
        [self.operationDict setObject:op forKey:shop.shop_image];
        
        //将请求加入全局队列
        [self.queue addOperation:op];
        }
    
    
    }
    

    //当内存发生警报时,调用
    - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.

        [self.imageCache removeAllObjects];
        [self.operationDict removeAllObjects];
    
        [self.queue cancelAllOperations];
    }
  • 相关阅读:
    SubVerSion 快速入门教程
    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法
    函数式编程初探(functional programming)
    用Openfire架设自己的即时聊天服务器
    把DataTable中的身份证号导出excel的解决方案
    jQuery Ajax 全解析
    总结使用Cookies的一些问题
    VS2008 AJAX控件介绍
    支付宝服务接口,实现虚拟交易和实物交易
    Qt QElapsedTimer
  • 原文地址:https://www.cnblogs.com/ldnh/p/5285185.html
Copyright © 2020-2023  润新知