iOS 处理缓存的三种方法
缓存处理是个相当头疼的事情,要根据需要综合应用不同的策略。总的来说有以下几种情况:
1.URL缓存,例如社交应用的帖子浏览,要在viewDidAppear:里面进行URL缓存。简单来说就是用NSURLCache类,首先在AppDelegate.m里面的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;方法里面创建一个NSURLCache的单例:
//设置内存缓存大小
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:10 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
然后的ViewController.m里面实现方法:
//网络缓存响应方法
- (IBAction)senderButton:(id)sender { //天气Api接口
NSString* path = @"http://www.weather.com.cn/data/sk/101110101.html";
[self getByURL:path andCallBack:^(id obj) { NSString *str = [[NSString alloc]initWithData:obj encoding:NSUTF8StringEncoding];
NSLog(@"=========================================================\n");
NSLog(@"post缓存测试:%@",str);
NSLog(@"=========================================================\n");
}]; }
//网络请求的内存缓存方法
-(void)getByURL:(NSString *)path andCallBack:(CallBack)callback{ NSString* pathStr = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:pathStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setCachePolicy:NSURLRequestReloadRevalidatingCacheData];
NSCachedURLResponse* response = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; //判断是否有缓存
if (response != nil) {
NSLog(@"有缓存");
[request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];
}else{ NSLog(@"没有缓存");
} //创建NSURLConnection
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
callback(data); }
2.文件缓存,例如用户信息等基本不会变化的信息保存在本地沙箱
//用户信息缓存用文件保存在沙箱
- (IBAction)userCache:(UIButton *)sender { self.UserPath = [self saveFileToDocuments:@"http://www.weather.com.cn/data/sk/101020100.html"];
}
//保存文件到沙箱
- (NSString *)saveFileToDocuments:(NSString *)url
{
NSString *resultFilePath = @""; NSString *destFilePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:url]; // 加上url,组合成本地文件PATH
NSString *destFolderPath = [destFilePath stringByDeletingLastPathComponent]; // 判断路径文件夹是否存在不存在则创建
if (! [[NSFileManager defaultManager] fileExistsAtPath:destFolderPath]) {
NSLog(@"文件夹不存在,新建文件夹");
[[NSFileManager defaultManager] createDirectoryAtPath:destFolderPath withIntermediateDirectories:YES attributes:nil error:nil];
} // 判断该文件是否已经下载过
if ([[NSFileManager defaultManager] fileExistsAtPath:destFilePath]) {
NSLog(@"文件已下载\n");
resultFilePath = destFilePath;
} else { NSLog(@"没有缓存,请求数据\n");
NSData *userInfoData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; if ([userInfoData writeToFile:destFilePath atomically:YES]) {
resultFilePath = destFilePath;
}
}
NSData *userInfoData=[[NSFileManager defaultManager] contentsAtPath:resultFilePath];
NSString* str = [[NSString alloc]initWithData:userInfoData encoding:NSUTF8StringEncoding]; NSLog(@"=========================================================\n");
NSLog(@"user:%@",str);
NSLog(@"=========================================================\n"); return resultFilePath;
}
3.图片缓存是最重要的,费流量还占内存,所以推荐使用第三方SDWebImage
最简单的就是用这个方法:
[self.imageView sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (cacheType==SDImageCacheTypeNone) { NSLog(@"没有缓存,从网络下载"); }else if (cacheType==SDImageCacheTypeDisk){ NSLog(@"有缓存,从磁盘读取"); }else{ NSLog(@"有缓存,从内存读取");
} }];
想知道这个方法的内部机制请看这里。
想要demo的去这里下载。
转载请注明出处!
iOS 处理缓存的三种方法的更多相关文章
- iOS拨打电话(三种方法)
iOS拨打电话(三种方法) 查了很多地方的关于iOS程序拨打电话,大都不全,今天我总结了三种方法,各有不同,拿来给大家分享,希望给大家有所帮助 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯 ...
- Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...
- 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...
- iOS清理缓存的几种方法
- (long long) fileSizeAtPath:(NSString*) filePath{ NSFileManager* manager = [NSFileManager defau ...
- iOS之加密的三种方法
//需要导入 #import <CommonCrypto/CommonCryptor.h> ==============MD5加密============ NSString *str ...
- iOS 拨打电话三种方法
小弟查了很多地方的关于iOS程序拨打电话,大都不全,今天我总结了三种方法,各有不同,拿来给大家分享,希望给大家有所帮助1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出 ...
- iOS拨打电话的三种方式
iOS拨打电话的三种方式 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 1 2 var string = "tel:" + "1 ...
- js清除浏览器缓存的几种方法
2014年9月24日 4692次浏览 关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数 ...
- 利用Objective-C运行时hook函数的三种方法
版权声明:转载请注明出处:http://blog.csdn.net/hursing 方法一,hook已有公开头文件的类: 首先写一个Utility函数: #import <objc/runtim ...
随机推荐
- 实验吧ctf题库web题wp
经历了学校的校赛,一度自闭,被大佬们刺激的要奋发图强. 1.后台登录 链接: http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 打开题目首先查看源码, ...
- PAT甲题题解-1052. Linked List Sorting (25)-排序
三个注意点: 1.给出的n个节点并不一定都在链表中 2.最后一组样例首地址即为-1 3.输出地址的时候一直忘记前面要补0... #include <iostream> #include & ...
- 团队week9
1. Bug bash ▪ How many bugs is found in your bug bash? Bug很多,就前端的用户管理部分发现的bug就有14个. 2. Write a blog ...
- Beta阶段冲刺-5
一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 4. 工作中遇到的困难 杨晨露:现在我过的某种意义上挺滋润的,没啥事了都.......咳,困难就是前端每天都在想砸电脑,我要怎么阻止 ...
- [福大软工] Z班 个人项目自动测试结果
个人项目第二次测试结果[9.16] 注:下表中的成绩满分为25分,正确性测试 共5个,每个3分.效率测试共 2个,每个5分. 根据数据统计分档如下, // 前为档级,后为分数. 参数为50000 0- ...
- OneZero第四周第三次站立会议(2016.4.13)
1. 时间: 15:15--15:30 共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...
- 洛谷SP16580 QTREE7 - Query on a tree VII(LCT,multiset)
洛谷题目传送门 思路分析 维护子树最值还是第一次写QwQ 因为子树的最值会变化,所以不能简单地把最值记下来,还要维护一个平衡树,把每个子树的最大值扔进去,来资磁插入.删除和查询最值. 然后我就懒得手写 ...
- 前端学习 -- Css -- 字体
设置字体颜色,使用color来设置文字的颜色 设置文字的大小,浏览器中一般默认的文字大小都是16pxfont-size设置的并不是文字本身的大小,在页面中,每个文字都是处在一个看不见的框中的我们设置的 ...
- Mysql(二)函数与连接
一.函数 1.if函数 if(exp1, exp2, exp3) 判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值. selec ...
- 2019.2.28&2019.3.1 考试
因为没A/改几道题,就一起写了 题目在LOJ上都能找到 2019.2.28 100+20+12 前两个小时一直在睡觉+想题也没思路,我太菜了 T1 洗衣服 分开处理出洗衣服和烘干的时间,然后一边正着排 ...