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

有兴趣的可以一起讨论下。

时间: 2024-12-20 23:17:48

AFNetworking之缓存篇的相关文章

深入解析开源项目之Universal-Image-Loader(二)缓存篇

珍惜作者劳动成果,如需转载,请注明出处. http://blog.csdn.net/zhengzechuan91/article/details/50292871 Universal-Image-Loader 是一个优秀的图片加载开源项目,Github地址在 (Github地址) ,很多童鞋都在自己的项目中用到了.优秀的项目从来都是把简单留给开发者,把复杂封装在框架内部.ImageLoader作为Github上Star数过万的项目,备受开发者青睐,所以我们有必要搞清楚它的内部实现. 在上一篇博客

高性能网站架构设计之缓存篇(3)- Redis的配置

我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题: 1.redis server 启动后,独占进程,能不能修改为后台服务呢? 2.redis server 服务是单线程的,而我的机器是多核的,能不能在同一台机器上开启多个实例更充分的利用 cpu 资源呢?但6379端口已经被前一个实例绑定,肯定会有冲突,那能不能修改默认端口呢? 答案是肯定的,redis 提供了灵活的配置方式,一种可以通过配置文件来配置,另一种你可以在运行时通过 config set 命令来修改配

前端技巧:禁止浏览器static files缓存篇(转)

前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题,好用!此方法假设浏览器是个好人!很听我们的话! <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="

Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门

文章目录 1. 声明式缓存 2. Spring Boot默认集成CacheManager 3. 默认的 ConcurrenMapCacheManager 4. 实战演练5. 扩展阅读 4.1. Maven 依赖 4.2. 开启缓存支持 4.3. 服务层 4.4. 控制层 4.5. 运行 4.6. 课后作业 6. 源代码 为了提高性能,减少数据库的压力,使用缓存是非常好的手段之一.本文,讲解 Spring Boot 如何集成缓存管理. 声明式缓存 Spring 定义 CacheManager 和

缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度HttpModule有一个了解,可以先看我的这篇文章<开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件> 对于文件级缓存来说,我们要知道两点,一为文件的URL,二为文件的 下面是HttpModuleCache的核心代码 /// <summary> ///

缓存篇(Cache)~大话开篇

闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种文章的能力了,所以,快马加鞭,把这个内功写出来,分享给大家,分享我的Fans! 缓存:缓存的领域很广泛,实现方法也很多,你可以使用文件,内存来实现缓存,而缓存的方法也有很多,对于一个网页来说,你可以缓存它的页面内容(HTML),或者缓存它的数据集(DataSet),这两种方式适用于不同的场合,对于需要主动触发的缓存,它可

探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.html#mvc 本章Demo:https://github.com/dunitian/LoTCodeBase/blob/master/NetCode/6.网页基础/BMVC5/MVC5Base/Controllers/CacheController.cs 这次来篇放松的,咱们不要老是说安全相关的东西.

Android volley 解析(四)之缓存篇

这是 volley 的第四篇 blog 了,写完这篇,volley 的大部分用法也都算写了一遍,所以暂时不会写 volley 的文章了,如果想看我前面写的文章,可以点这里 Android volley 解析(三)之文件上传篇 为什么要用缓存 我们知道,当客户端在请求网络数据的时候,是需要消耗流量的,特别是对于移动端用户来说,对于流量的控制要求很高.所以在做网络请求的时候,如果对数据更新要求不是特别高,往往都会用到缓存机制,一方面能减少对服务端的请求,控制流量:另一方面,当客户端在没有网络的情况下

Hibernate【缓存篇】

一.SQL语句什么时候发出? SQL语句其实并不是在transaction.commit()的时候发出的,而是在一句session.flush()发出.在transaction.commit()的内部就调用了session.flush()方法.之后才会提交SQL语句 Session.flush()到底做了什么? 在Hibernate内部去检查所有的持久化对象,如果持久化对象是由临时状态转换过来的,发出insert语句:如果持久化对象是由get方法得到的,再查看下副本,如果和副本对照一致,什么都不