苦苦看了我两天,最近后台为了减轻压力,要我做缓存,我说好吧......

借鉴了别人的说法找到一张图可以看明白好多:

     

这个是我比较战成一种方案。

好了直接上代码了

首先我们要有自己缓存的类 说以就自己用读写方式简单写了一个类

+ (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之缓存篇的更多相关文章

  1. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  2. 缓存篇(Cache)~大话开篇

    回到占占推荐博客索引 闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种 ...

  3. 缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)

    返回目录 今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈! 书归正传,今天我带来一个Static静态成员的缓存,其实它也不 ...

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

    返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...

  5. 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存

    返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...

  6. (转)高性能网站架构之缓存篇—Redis集群搭建

    看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...

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

    前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...

  8. AspnetCore 缓存篇

    AspnetCore 缓存篇 一.缓存的作用 怎样理解缓存: 其实所有的程序,架构,优化,线程...等技术手段,最终的目的都是如何使产品快速的响应用户的操作,提高用户的体验性,目标都是为了系统的使用者 ...

  9. Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache

    文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...

随机推荐

  1. json_encode 中文乱码

    用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似"\u***"的格式, 还会在一定程度上增加传输的数据量. 而在PHP5.4, 这个问题终 ...

  2. alibaba fastjson List<Map<String, String>>2Str

    import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; impo ...

  3. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  4. 上标、下标~不常用的 html 标签

    <sup>上标 <sub>下标 <small>小号字 <del> 删除线 ======> 对应的 js stringObj.sup()  上标 s ...

  5. nodejs 服务端添加相应头Access-Control-Allow-Origin

    重点在这句:res.setHeader("Access-Control-Allow-Origin", "*"); var http = require(&quo ...

  6. find / -type f -name "*fetion*" |xargs rm -rf {}\

    find / -type f -name "*fetion*" |xargs rm -rf {}\

  7. js Date 函数方法 和 移动端数字键盘调用

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...

  8. Android数据存储方式

    Android提供了5种方式存储数据: 1.使用SharedPreferences存储数据:它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中.只能在同一个 ...

  9. IO多路复用,实现多线程监听

    服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001)) sk1.listen() sk2 = socket.socke ...

  10. 【图像处理】【SEED-VPM】3.外设信息

    ———————————————————————————————————————————————————————————————————————— 摄像头接口 具有AV端子输出的彩色摄像头,摄像头广角8 ...