zoukankan      html  css  js  c++  java
  • iOS网络图片缓存详解

    在开发移动应用的时候比如Android,IOS,因为手机流量、网速、内存等这些因素,当我们的移动应用是针对互联网,并要频繁访问网络的话,对网络优化这块就显得尤为重要了。

    比如某个应用要经常显示网络图片,就不能每次显示图片都去网络上下载,那太耗费时间也太耗费流量,这时就要对网络图片进行缓存了,以下是我对IOS网络图片缓存的一些见解,有不足之处,欢迎大家指出来,一起探讨。

    处理网络图片缓存步骤:

    1、根据图片URL查找内存是否有这张图片,有则返回图片,没有则进入第二步

    2、查找物理存储是否有这张图片,有则返回图片,没有则进入第三步

    3、从网络上下载该图片,下载完后保存到内存和物理存储上,并返回该图片

    注:因为URL包含特殊字符和长度不确定,要对URL进行MD5处理或其他处理

    下面是针对以上步骤的代码讲解:

    1、内存缓存图片处理

    使用NSMutableDictionary存储图片UIImage,数组的Key为该图片的URL地址

    //缓存图片到内存上
    [plain] view plain copy
    1. [memCache setObject:image forKey:key];  


    2、物理缓存图片处理

    把图片保持到物理存储设备上,则直接使用NSFileManager,把URL作为文件名保存

    3、网络图片下载处理

    图片使用异步下载,下载完后把图片保持到NSMutableDictionary和物理存储上

    以下是摘自SDWebImageleik网络图片缓存处理的一个类,有详细注释

    .h文件

    @interface SDImageCache : NSObject  
    {  
        NSMutableDictionary *memCache;//内存缓存图片引用  
        NSString *diskCachePath;//物理缓存路径  
        NSOperationQueue *cacheInQueue, *cacheOutQueue;  
    }  
      
    + (SDImageCache *)sharedImageCache;  
      
    //保存图片  
    - (void)storeImage:(UIImage *)image forKey:(NSString *)key;  
      
    //保存图片,并选择是否保存到物理存储上  
    - (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;  
      
    //保存图片,可以选择把NSData数据保存到物理存储上  
    - (void)storeImage:(UIImage *)image imageData:(NSData *)data forKey:(NSString *)key toDisk:(BOOL)toDisk;  
      
    //通过key返回UIImage  
    - (UIImage *)imageFromKey:(NSString *)key;  
      
    //如果获取内存图片失败,是否可以在物理存储上查找  
    - (UIImage *)imageFromKey:(NSString *)key fromDisk:(BOOL)fromDisk;  
      
      
    - (void)queryDiskCacheForKey:(NSString *)key delegate:(id <SDImageCacheDelegate>)delegate userInfo:(NSDictionary *)info;  
      
    //清除key索引的图片  
    - (void)removeImageForKey:(NSString *)key;  
    //清除内存图片  
    - (void)clearMemory;  
    //清除物理缓存  
    - (void)clearDisk;  
    //清除过期物理缓存  
    - (void)cleanDisk;  
      
    @end  
  • 相关阅读:
    统计某个状态最新出现的连续次数
    debian 10 xface 安装输入法
    Temporary failure in name resolution
    Leetcode199二叉树的右视图(宽搜)
    Leetcode200岛屿数量(深搜)
    Leetcode130. 被围绕的区域(深搜)
    Leetcode116. 填充每个节点的下一个右侧节点指针(宽搜或深搜)
    Leetcode之二叉树展开为链表(深搜)
    Leetcode之路径总和II
    vue学习02-v-text
  • 原文地址:https://www.cnblogs.com/yulang314/p/5238422.html
Copyright © 2011-2022 走看看