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 ...
随机推荐
- 企业落地Kubernetes的问题与对策
在当今云计算领域,“容器技术”已经从三四年前的炒作期正式进入了产业落地期,而Kubernetes作为容器平台的标准已经得到了广泛应用. Kubernetes从2014年6月由Google宣布开源,到2 ...
- Python中的字典详解
https://www.cnblogs.com/yjd_hycf_space/p/6880026.html
- IDA Pro 在CSAPP lab2中的使用
在做lab2的时候,偶然的情况下,发现了IDA pro这样一个反汇编工具,总的来说对于lab2这样的小实验读懂代码的大体功能是有作用的,但对于想要具体明白某一条指令的执行过程,又显得不足,到最后还是需 ...
- c# winform调用摄像头识别二维码
首先我们需要引用两个第三方组件:AForge和zxing. Aforge是摄像头操作组件,zxing是二维码识别组件.都是开源项目.避免重复造轮子. 其实一些操作代码我也是参照别人的,若侵犯您的版权, ...
- Alpha版总结会议——班级派
一.开会的过程 在周一下午上课的最后20分钟内,我们组进行了“班级派”的alpha版的总结会议.首先进行的是分析目前的版本情况,每个人说了自己的进度,包括已经完成的以及即将要完成的.随后是分析前段时间 ...
- 12th 本周工作量及进度统计
本周PSP: C(类别) C(内容) S(开始时间) ST(结束时间) I(中断时间) T(实际时间) 活动 1日—3日 用户调查 12月1日21:00 12月3日12:00 25小时 14小时 活动 ...
- Linux命令(十七) 关机命令
在 Linux 系统下一些常用的关机/重启命令有 shutdown.halt.reboot以及init,他们都可以达到重启系统的目的,但每个命令的内部工作过程不同. 一.使用 shutdown 关机或 ...
- 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...
- gym101350 c h m
C. Cheap Kangaroo time limit per test 1.0 s memory limit per test 256 MB input standard input output ...
- 【BZOJ1970】[AHOI2005]矿藏编码(模拟)
[BZOJ1970][AHOI2005]矿藏编码(模拟) 题面 BZOJ 洛谷 题解 随便写个高精度模拟一下就完了. #include<iostream> #include<cstd ...