AFNetworking之缓存篇
苦苦看了我两天,最近后台为了减轻压力,要我做缓存,我说好吧......
借鉴了别人的说法找到一张图可以看明白好多:
这个是我比较战成一种方案。
好了直接上代码了
首先我们要有自己缓存的类 说以就自己用读写方式简单写了一个类
+ (void)cacheForData:(NSData *)data fileName:(NSString *)fileName
{
NSString *path = [kCachePath stringByAppendingPathComponent:[YBMD5 md5:fileName]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[data writeToFile:path atomically:YES];
});
}
+ (NSData *)getCacheFileName:(NSString *)fileName
{
NSString *path = [kCachePath stringByAppendingPathComponent:[YBMD5 md5:fileName]];
return [[NSData alloc] initWithContentsOfFile:path];
}
+ (NSUInteger)getAFNSize
{
NSUInteger size = 0;
NSFileManager *fm = [NSFileManager defaultManager];
NSDirectoryEnumerator *fileEnumerator = [fm enumeratorAtPath:kCachePath];
for (NSString *fileName in fileEnumerator) {
NSString *filePath = [kCachePath stringByAppendingPathComponent:fileName];
NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
size += [attrs fileSize];
}
return size;
}
这些大家都有自己的方式 。
然后开始在我们的AF中写一些东西 就可以了
-(AFHTTPSessionManager *)manager{
static AFHTTPSessionManager *rmanager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
rmanager = [AFHTTPSessionManager manager];
rmanager.responseSerializer = [AFJSONResponseSerializer serializer];
rmanager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"image/jpg",@"application/x-javascript",@"keep-alive", nil];
// 设置超时时间
[rmanager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
rmanager.requestSerializer.timeoutInterval = 60.f;
[rmanager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
});
return rmanager;
}
-(void)requsetWithPath:(NSString *)path withParams:(NSDictionary *)params withCacheType:(YBCacheType)cacheType withRequestType:(NetworkRequestType)type withResult:(ZmzBlock)resultBlock{
if (!self.isConnected) {
NSLog(@"没有网络,建议在手机设置中打开网络");
// return;
}
switch (type) {
case NetworkGetType:
{
YBCache *cache = [self getCache:cacheType url:path params:params withResult:resultBlock];
NSString *fileName = cache.fileName;
if (cache.result) return;
[self.manager GET:path parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
YBLog(@"---------%lld", downloadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (resultBlock) {
//缓存数据
NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:nil];
[YBCacheTool cacheForData:data fileName:fileName];
[self handleRequestResultWithDataTask:task responseObject:responseObject error:nil resultBlock:resultBlock];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestResultWithDataTask:task responseObject:nil error:error resultBlock:resultBlock];
}];
}
break;
case NetworkPostType:
{
NSString *cutPath = [NSString stringWithFormat:@"%@%@",MAIN_URLL,path];
//缓存数据的文件名 data
YBCache *cache = [self getCache:cacheType url:cutPath params:params withResult:resultBlock];
NSString *fileName = cache.fileName;
if (cache.result) return;
[self.manager POST:cutPath parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (resultBlock) {
//缓存数据
NSData *data = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:nil];
[YBCacheTool cacheForData:data fileName:fileName];
[self handleRequestResultWithDataTask:task responseObject:responseObject error:nil resultBlock:resultBlock];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestResultWithDataTask:task responseObject:nil error:error resultBlock:resultBlock];
}];
}
break;
default:
break;
}
}
这样大致的步骤就搞定了,可以根据自己的项目需求来定。
这只是成功的第一步 之后又整了半天 整理到了git上去
https://github.com/walkingzmz/MZAFNetworking
有兴趣的可以一起讨论下。
AFNetworking之缓存篇的更多相关文章
- jQuery2.x源码解析(缓存篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...
- 缓存篇(Cache)~大话开篇
回到占占推荐博客索引 闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种 ...
- 缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)
返回目录 今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈! 书归正传,今天我带来一个Static静态成员的缓存,其实它也不 ...
- 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存
返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...
- 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存
返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...
- (转)高性能网站架构之缓存篇—Redis集群搭建
看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...
- 前端技巧:禁止浏览器static files缓存篇(转)
前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...
- AspnetCore 缓存篇
AspnetCore 缓存篇 一.缓存的作用 怎样理解缓存: 其实所有的程序,架构,优化,线程...等技术手段,最终的目的都是如何使产品快速的响应用户的操作,提高用户的体验性,目标都是为了系统的使用者 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache
文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...
随机推荐
- BZOJ4247挂饰
Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩 ...
- struts 头像上传
java代码: 1 package cn.itcast.nsfw.user.action; import java.io.File; import java.io.IOException; impor ...
- grunt不是内部或外部命令错误处理
如题, npm install -g grunt-cli发现grunt命令却不可用, 其实是环境变量问题,但是网上很多给出的方法其实是不准确的, 正确方法,可以通过npm root -g查看路径,之后 ...
- C#中使用Linq实现全外连接
每次使用都到处查阅,现在记录下来,备查. var fulljoin = (from s in sampleRegistersjoin t in tensionDatas on new { Beach ...
- sphinx全文检索 安装配置和使用
公司项目刚刚导入大量产品数据,然后发现网站的产品搜索很卡,原本是原生sql的like来做模糊搜索,数据量20W的时候还可以接受,但是上百万就很卡了,所以需要做优化. 经过考虑,打算采用全文检索 sph ...
- text/plain && text/html
text/plain和text/html都是Content-Type; text/plain : 页面以文本形式输出 text/html: 页面以html格式输出
- 最佳的 14 个免费的响应式 Web 设计测试工具
一旦你决定要搭建一个网站就应该已经制定了设计标准.你认为下一步该做什么呢?测试!我使用“测试”这个词来检测你网站对不同屏幕和浏览器尺寸的响应情况.测试在响应式网页设计的过程中是很重要的一步.如果你明白 ...
- 20169212《Linux内核原理与分析》第四周作业
Linux第四周作业 1. 堆栈知识 首先回顾了下堆栈相关的知识,堆栈机制是高级语言可以运行的一个基础,这一块需要重点掌握.函数发生调用时,如图 call指令:将eip的按顺序执行的下一条指令(因为在 ...
- <context:component-scan>使用说明
Spring组件扫描<context:component-scan/>使用详解 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫 ...
- 关于KINECT2 和ROS接口安装的问题
具体安装过程见此博客 http://www.itdadao.com/articles/c15a450477p0.html 感谢博主. 注意,在我自己的电脑上,最后测试的两条代码执行不了,即:1)ros ...