zoukankan      html  css  js  c++  java
  • 浅谈缓存的处理

       首先说一下iOS中的缓存机制

       在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制。

     使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。内存缓存我们可以使用sdk中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们看下它的CachePolicy类型。

       1、NSURLRequestUseProtocolCachePolicy NSURLRequest默认的cache policy,使用Protocol协议定义。

       2、NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载。

       3、NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载。

       4、NSURLRequestReturnCacheDataDontLoad 只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;

       5、NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。

       6、NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。

      使用缓存机制进行缓存处理的话既可以提高访问的效率,也可以减轻服务器的压力,因为从本地cpu中取出数据的话,会比重新从网络上下载来讲快100~200倍;

      封装一个处理缓存的类 (eg:CacheManager)

       #import <Foundation/Foundation.h>

      1、首先写一个单例方法(下一篇我会详细介绍一下单例的实现以及作用)

     +(CacheManager *)sharedManager;

     2、 //判断name的缓存的数据文件是否存在

        -(BOOL)isDataExistsForName:(NSString *)name;

       3、 //保存数据

       -(void)saveData:(NSData *)data forName:(NSString *)name;

       4、//取数据

       -(NSData *)getDataFromName:(NSString *)name;

       5、//将第page页的数据保存在name文件中

       -(void)saveListData:(NSData *)data forName:(NSString *)name forPage:(NSInteger)page;

       6、//取路径

       -(NSString *)getPathWithName:(NSString *)name; -(void)clear;

       7、 //实现清除缓存 (就是清空你之前保存在沙盒路径下的文件夹)

      -(void)clear;

     下面为大家介绍下实现清除缓存时计算文件夹大小的方法:

       (1.)

        计算文件夹的大小

        +(float)fileSizeAtPath:(NSString *)path{

           NSFileManager *fileManager=[NSFileManager defaultManager];

           if([fileManager fileExistsAtPath:path]){

              long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize;

            return size/1024.0/1024.0; 

        }

        return 0;

    }

        计算目录大小

        +(float)folderSizeAtPath:(NSString *)path{

            NSFileManager *fileManager=[NSFileManager defaultManager];

            float folderSize;

            if ([fileManager fileExistsAtPath:path]) {

                 NSArray *childerFiles=[fileManager subpathsAtPath:path];

               for (NSString *fileName in childerFiles) {

                   NSString *absolutePath=[path stringByAppendingPathComponent:fileName];

                   folderSize +=[FileService fileSizeAtPath:absolutePath];

            }

         //SDWebImage框架自身计算缓存的实现

            folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;

            return folderSize;

        }

        return 0;

    }

       (2.)

         清理缓存文件

        同样也是利用NSFileManager API进行文件操作,SDWebImage框架自己实现了清理缓存操作,我们可以直接调用。

        +(void)clearCache:(NSString *)path{

            NSFileManager *fileManager=[NSFileManager defaultManager];

            if ([fileManager fileExistsAtPath:path]) {

                NSArray *childerFiles=[fileManager subpathsAtPath:path];

                for (NSString *fileName in childerFiles) {

                    //如有需要,加入条件,过滤掉不想删除的文件

                    NSString *absolutePath=[path stringByAppendingPathComponent:fileName];

                    [fileManager removeItemAtPath:absolutePath error:nil];

            }

        }

        [[SDImageCache sharedImageCache] cleanDisk];

    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    对websoceket进行压力测试(一)
    学习springboot的一个网站
    重装mysql数据库
    websocket扫盲:基础知识(二)
    json-lib 之jsonConfig详细使用
    hibernate的like用法(用占位符解决)
    【转载】hibernate查询参数绑定
    Struts2 Anotation action
    PLSQL怎样导出oracle表结构
    从命令行启动oracle服务
  • 原文地址:https://www.cnblogs.com/MasterPeng/p/5000049.html
Copyright © 2011-2022 走看看