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 ...
随机推荐
- python爬虫-使用cookie登录
前言: 什么是cookie? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想 ...
- Alpha冲刺第9天
Alpha第9天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...
- 深入 Java Web
该系列 记录下,深入 学习 Java Web 过程. 1.Tomcat总体结构 2.Tomcat 启动流程 3.ServletContext详解 4.Servlet详解
- delphi中登录界面关闭直接现实主界面是怎么回事?
修改工程文件: Application.Initialize; Application.CreateForm(TmainForm, mainForm); Application.ShowMainFor ...
- aop 切点匹配规则
- jmeter测试soap协议时候 路径不需要添加
- contentInsetAdjustmentBehavior各个值之间的区别
iOS11也出了不少时候了网上说适配的文章一大堆.关于contentInsetAdjustmentBehavior这个参数之间的区别,好像没什么人能说明.往下看的前提是你已经知道什么是安全区域,没看明 ...
- 99种用Racket说I love you的方式
99种用Racket说I love you的方式 来源 https://www.tuicool.com/articles/qiyeAz 原文 http://www.soimort.org/posts ...
- MT【196】整数个数
设函数$f(x)=x^2-2ax+15-2a$的两个零点分别为$x_1,x_2$, 且在区间$(x_1,x_2)$上恰好有两个正整数,则实数$a$的取值范围______ 提示:$1<|x_1-x ...
- diyiti.cpp
diyiti.cpp/c/pas diyiti.in diyiti.out 2s/256MB 给定两个01串,S,T(下标从0开始). 支持如下3种操作: 1. 修改S第i位的字符,即0->1, ...