zoukankan      html  css  js  c++  java
  • 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];
    }
  • 相关阅读:
    asp.net 页面生命周期事件详细
    linux服务nfs与dhcp篇
    linux服务samba与ftp篇
    官网Android离线文档下载
    Android发布apk后解决百度地图不显示的问题
    win10和office2013激活
    Android-Intent and Intent Filters
    Android设置透明状态
    Android获取屏幕大小(Px)
    我的java web之路(JSP基本语法)
  • 原文地址:https://www.cnblogs.com/ldnh/p/5285185.html
Copyright © 2011-2022 走看看