AFNetworking3.x与YYCache的二次封装,和FM

作者: jkpang | 来源:发表于2016-08-24 23:26 被阅读7793次

PPNetworkHelper

现在绝大部分的APP都会对服务器端的数据进行缓存,以增强用户体验,不让APP在无网状态下显得光秃秃的。之前在我自己的一个项目中使用的是FMDB进行的离线缓存,虽然FMDB大大简化了SQLite语句的繁琐,但需要缓存的东西一但多起来,用起来还是比较麻烦的。(2016/9/27更新-,无需设置,,无需插件,控制台可直接打印中文字符,Xcode8绝配!)
  无意中看到一篇ibiremeYYCache 设计思路的技术博客,就知道发现我想要的东西了,以下就是对AFNetworking 3.x 与YYCache的二次封装,封装常见的GET、POST、文件上传/下载、网络状态监测的功能、方法接口简洁明了,使用YYCache(缓存性能足够优秀,详情可戳其博客)实现对网络数据的自动缓存,简单易用,不用再写FMDB那烦人的SQL语句,一句代码搞定网络数据的请求与缓存.

演示图

一、PPNetworkHelper, 网络请求部分对AFN3.x的简单封装

1.GET请求无缓存

/**
 *  GET请求,无缓存
 *
 *  @param URL        请求地址
 *  @param parameters 请求参数
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancle方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)URL parameters:(NSDictionary *)parameters success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure;

2.GET请求自动缓存

/**
 *  GET请求,自动缓存
 *
 *  @param URL           请求地址
 *  @param parameters    请求参数
 *  @param responseCache 缓存数据的回调
 *  @param success       请求成功的回调
 *  @param failure       请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancle方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)URL parameters:(NSDictionary *)parameters responseCache:(HttpRequestCache)responseCache success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure;

3.POST请求无缓存

/**
 *  POST请求,无缓存
 *
 *  @param URL        请求地址
 *  @param parameters 请求参数
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancle方法
 */
+ (__kindof NSURLSessionTask *)POST:(NSString *)URL parameters:(NSDictionary *)parameters success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure;

4.POST请求自动缓存

/**
 *  POST请求,自动缓存
 *
 *  @param URL           请求地址
 *  @param parameters    请求参数
 *  @param responseCache 缓存数据的回调
 *  @param success       请求成功的回调
 *  @param failure       请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancle方法
 */
+ (__kindof NSURLSessionTask *)POST:(NSString *)URL parameters:(NSDictionary *)parameters responseCache:(HttpRequestCache)responseCache success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure;

5.上传图片文件

/**
 *  上传图片文件
 *
 *  @param URL        请求地址
 *  @param parameters 请求参数
 *  @param images     图片数组
 *  @param name       文件对应服务器上的字段
 *  @param fileName   文件名
 *  @param mimeType   图片文件的类型,例:png、jpeg(默认类型)....
 *  @param progress   上传进度信息
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancle方法
 */
+ (__kindof NSURLSessionTask *)uploadWithURL:(NSString *)URL parameters:(NSDictionary *)parameters images:(NSArray<UIImage *> *)images name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType progress:(HttpProgress)progress success:(HttpRequestSuccess)success failure:(HttpRequestFailed)failure;

6.下载文件

/**
 *  下载文件
 *
 *  @param URL      请求地址
 *  @param fileDir  文件存储目录(默认存储目录为Download)
 *  @param progress 文件下载的进度信息
 *  @param success  下载成功的回调(回调参数filePath:文件的路径)
 *  @param failure  下载失败的回调
 *
 *  @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,开始下载调用resume方法
 */
+ (__kindof NSURLSessionTask *)downloadWithURL:(NSString *)URL fileDir:(NSString *)fileDir progress:(HttpProgress)progress success:(void(^)(NSString *filePat
+ h))success failure:(HttpRequestFailed)failure;

7.监听网络状态及网络状态实时回调

/**
 *  开始监听网络状态
 */
+ (void)startMonitoringNetwork;

/**
 *  通过Block回调实时获取网络状态,也可以通过返回值进行一次性判断
 */
+ (BOOL)checkNetworkStatusWithBlock:(NetworkStatus)status;

二、PPNetworkCache,数据缓存部分对YYCache简单封装

/**
 *  缓存网络数据
 *
 *  @param responseCache 服务器返回的数据
 *  @param key           缓存数据对应的key值,推荐填入请求的URL
 */
+ (void)saveHttpCache:(id)httpCache forKey:(NSString *)key;

/**
 *  取出缓存的数据
 *
 *  @param key 根据存入时候填入的key值来取出对应的数据
 *
 *  @return 缓存的数据
 */
+ (id)getHttpCacheForKey:(NSString *)key;

/**
 *  获取网络缓存的总大小 bytes(字节)
 */
+ (NSInteger)getAllHttpCacheSize;

/**
 *  删除所有网络缓存,
 */
+ (void)removeAllHttpCache;

三、请求示例

1.无缓存

[PPNetworkHelper GET:url parameters:nil success:^(id responseObject) {
           //请求成功
        } failure:^(NSError *error) {
            //请求失败
        }];

2.自动缓存

[PPNetworkHelper GET:url parameters:nil responseCache:^(id responseCache) {
          //加载缓存数据
        } success:^(id responseObject) {
            //请求成功
        } failure:^(NSError *error) {
            //请求失败
        }];
以上就是对AFN3.x结合YYCache的简单封装,全部是类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~代码已经托管到GitHub.如果觉得好用还请Star一波哈,你的Star是我持续更新的动力! https://github.com/jkpang/PPNetworkHelper

相关文章

网友评论

  • 7c43181c05c7:大佬,这个请求webservice的时候,如何添加请求头和请求体。
  • 周英俊a:大佬 请问下为什么二次封装返回数据类型没有 “” 了?
  • SoaringHeart:有一个致命缺陷,没有过期策略
  • SoaringHeart:+ (void)setAFHTTPSessionManagerProperty:(void (^)(AFHTTPSessionManager *))sessionManager {
    sessionManager ? sessionManager(_sessionManager) : nil;
    }
    没看懂,能简单说下嘛?
  • hhgvg:post上传json字符串 怎么设置
  • Q上帝的宠儿Q:什么啊 坑死人 解析出来的数据格式不正常 全部都是无""号的 字符串
  • WGGHot:献上我的双膝,膜拜
  • EI_Rey:涉及到分页缓存怎么做?
  • EI_Rey:如何能做到只有当服务器端的资源有更新的时候才请求返回data,避免每次进一个页面都要走一次网络请求呢?和If-Modified-Since有关吗?
  • EI_Rey:如果请求的数据是有分页的,responseCache和responseObject代码块中,都写了[self.lookBookList addObjectsFromArray:model.result.product_list];那最终展示的数据不是有重复的了吗?
  • EI_Rey:上传图片,内存暴涨怎么办?
  • 安小贤:你好,里面有请求后的response状态码的封装吗?我们这边的接口不允许对json里的status状态进行判断?期待回复🙏
  • 806349745123:印象中,AFN内部本身有对http请求的缓存机制,你这样的封装,性能会有提高吗?
  • TikBai:PPNetworkHelper 下载zip包没有走进度条
  • TikBai:放到我的程序中 + (NSURLSessionTask *)downloadWithURL:(NSString *)URL
    fileDir:(NSString *)fileDir
    progress:(PPHttpProgress)progress
    success:(void(^)(NSString *))success
    failure:(PPHttpRequestFailed)failure {
    这个方法中 发现没有走下载进度的方法
  • xiao晖:在git上搜到您的框架,用着很不错。现在发现有个小问题,接口 取消指定url请求
    + (void)cancelRequestWithURL:(NSString *)URL;
    那么该 url对应的task是取消了,但是请求的block回调还是没有监听到请求失败的响应,请问该如何解决
  • 51d110d37245:大神,我有一个问题,我设置了请求超时时间,如果超时了会自动提示吗,比如说有个弹窗之类的,还是要我自己判断啊
  • Hye丶:有内存泄漏!
  • 讨厌下雨的鱼:您好,我想请教两个问题:
    1.DOME中的PPHTTPRequest为何不采用继承PPNetworkHelper的方式?
    2.因为全局只有一个AFHTTPSessionManager实例,当设置请求头的时候,会导致所有的请求都带有那个请求头,是不是其他不需要那个请求头的请求需要手动清空呀?
  • 范孟:你好,我这边发现了一个问题,在从缓存取值的时候,那个key值,取得是字符串的hash,这个hash不是唯一的……我替换为MD5的……
  • c066fe49abc4:你好,我用的你分享的这个网络框架,我想请教个问题。如果我想在数据请求失败的时候自动再请求三次,三次都失败的话才算是数据请求失败。我的想法是记录请求失败的次数,不超过三次的话重新调用网络请求的方法,超过的话直接返回失败的block,但是我在请求失败 failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)中不知如何处理重新请求的操作,想请问一下,你觉得该怎么处理或者说你有没有什么其他的一些建议。
  • 笙笔记:亲 !你知道post请求报这个咋处理吗?Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set., NSUnderlyingError=0x600000452b10 {Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: bad request (400)" UserInfo={NSLocalizedDescription=Request failed: bad request (400), NSErrorFailingURLKey=http://192.168.1.67:8080/LongMuseum/handset/classOutline?, com.alamofire.serialization.response.error.data=<0d0a3c21 444f4354 59504520 68746d6c 20505542 4c494320 222d2f2f 5733432f 2f445444 2048544d 4c20342e 30312054 72616e73 6974696f 6e616c2f 2f454e22 20226874 74703a2f 2f777777 2e77332e 6f72672f 54522f68 746d6c34 2f6c6f6f 73652e64 7464223e 0d0a0d0a 0d0a0d0a 0d0a0d0a 0d0a3c68 746d6c3e 0d0a3c68 6561643e 0d0a093c 6d657461 20687474 702d6571 7569763d 22436f6e 74656e74 2d547970 65222063 6f6e7465 6e743d22 74657874 2f68746d 6c3b2063 68617273 65743
    2017-09-08 09:59:24.972027+0800 BIM_Ios_App[1383:47170] 2017-9-18
    2017-09-08 09:59:24.972536+0800 BIM_Ios_App[1383:47170] date 2017-09-18 courseId C17083101 url http://192.168.1.67:8080/LongMuseum/handset/classOutline?
  • sun_dev:你好,你的这个框架,怎么实现请求队列,我们这边有个需求就是下一个请求依赖上一个请求的返回参数
    沙子LOVE:@sun_dev 你是把上一个请求放在 线程组 group 里面解决的吗
  • cf2632a8e56a:哥 这个 缓存有bug啊 我get 请求缓存, 取出来 是nil 我看你 是YYCache异步存,然后同步方法取G 了
  • 我是Python小白:在block回调里面直接用self访问成员变量不会导致循环引用么?
  • 猜火车丶:用pods同时引入PPNetworkHelper和YYKit,会多一个在YYCache里面说有个文件未找到,在移除PPNetworkHelper就正常,请问这个问题怎么解决呀?
    jkpang:@你在我后半生的城市里长生不老 不要导入整个YYKit框架,按需要依次导入YYKit中的组件
  • Coder大雄:博主,我想问下,你这里面写没写超过多少秒没请求到数据,就直接读取缓存的方法?
    jkpang:@Coder大雄 这个缓存逻辑倒是没有,可以自己实现
  • 鬼丶白:请问楼主 我在项目里面已经pod过了 YYKit 框架 再Pod 你的这个 会冲突 怎么解决啊
    鬼丶白:@jkpang ...好吧
    jkpang:@soime 那YYkit里面的框架你只能分散用pod 导入了,不能导入整个YYkit
  • 鬼丶白:博主你好 我想问一下关于PPHTTPRequest 这一层的网络封装,我需要把所有的请求分配一个方法写在 PPHTTPRequest 里面吗? 类似于你给的例子,登录,登出接口。
    jkpang:@soime 嗯嗯,是的,每一个请求对应一个方法,每个方法只暴露参数入口(如果参数固定不变,甚至可以不用暴露任何入口)。如果项目的请求很多,也可以为请求类添加分类,每个分类对应一个模块的请求,这样看起来不会太乱。总之,根据你项目的实际需求来,一套方法,一套设计模式不可能适应所有项目。
    鬼丶白:@jkpang 我也是想不到好的处理方法所以请教一下, 如果项目有上百个请求的话岂不是PPHTTPRequest这个类里面要对应上百个方法咯
    jkpang:@soime 我目前的项目是这样做的,但你不一定非得按照我这个方法来做,根据你自己项目的实际需求来制定方案,我的做法仅仅是抛砖引玉:blush:
  • sun_dev:支持获取返回的header吗?
    jkpang:@Guo浮沉 可以的,你在请求成功的block里面捕获 NSURLSessionTask对象就好了
  • Parkour皇:你好我想问一下 用户修改名字和照片用uploadWithURL可以么?
  • roc_鹏:PP有个问题求大神帮我解答,就是PP结合YYCache做的缓存,和直接用AFN设置缓存策略做缓存(NSCache),优势在哪里,只是性能提高了吗 ?还有就是PP请求错误时只返回了NSError,并没给我NSURLSessionDataTask对象,我要做错误处理,只能根据NSError返回信息来做,但NSError返回到错误code太多,没有NSURLSessionDataTask 返回的statusCode清晰好做,这个你们时怎么处理的呢,难道直接改PP源码吗?
    roc_鹏:@jkpang + (BOOL)isNetwork这个方法是有问题的,在进入界面直接就发起请求,并调用+ (BOOL)isNetwork检测网络,返回的一直为NO,我延迟1s,或者在+ (void)networkStatusWithBlock:(PPNetworkStatus)networkStatus;这个block内调用就可以得到正确的网络状况,原因应该是AFNetworkReachabilityManager检查网络存在延迟导致的。
    roc_鹏:@jkpang 我又遇到个问题,+ (BOOL)isNetwork; 这个方法 为什么我连着网的 却返回NO?换用Reachability检测就没问题。
    jkpang:@roc_鹏 AFN自带的缓存我没有用过,AFN自带的缓存只支持GET请求吧. 网络json数据体量很小,性能什么的倒不是问题,使用YYCache的原因是此框架很优秀,值得一用(性能应该是目前iOS开源缓存框架最好的).NSURLSessionDataTask对象是可以在获取的,只是我没有在请求结果的Block里回调出来,你需要这样做, 在block内捕获局部变量需要加__block修饰:
    __block NSURLSessionDataTask * task = nil;
    task = [PPNetworkHelper GET:url parameters:para success:^(id responseObject) {
    NSLog(@"NSURLSessionDataTask = %@",task);
    } failure:^(NSError *error) {

    }];
  • roc_鹏:请问下,里面封装的有网络加载指示器吗
    roc_鹏:就是YYDiskCache和NSURLCache的性能上的优势吗
    roc_鹏:@jkpang 麻烦再问下,使用这个缓存数据,和AFN自身提供的缓存机制有什么显著优势呢?
    jkpang:@roc_鹏 这个没有啊,需要自己自定义
  • footSInRoad:请问一下:从后台请求数据 为什么控制台 会打印 [PPNetworkHelper POST:parameters:responseCache:success:failure:]_block_invoke_2 第144行
    responseObject = <7b224c65 73735769 74686472 6177616c 42616c61 6e636522 3a31352c 22636f64 65223a31 2c225769 74686472 6177616c 42616c61 6e636546 6565223a 312c2262 616e6b4c 69737422 3a5b5d2c 226d6573 73616765 223a22e6 9fa5e8af a2e68890 e58a9f22 7d> ,上架后在app也会打印吗?
    footSInRoad:恩恩 我试试啊 谢谢这么快恢复:+1:
    jkpang:@rensheng 那是因为你们服务器返回的数据格式为二进制格式AFN解析不了,你要在请求之前设置一下服务器响应数据格式: [PPNetworkHelper setResponseSerializer:PPResponseSerializerHTTP] , 上架后APP是不会打印的
  • 沙暴送葬:请问可以上传视频文件吗
    jkpang:@沉默终 可以的, 可以根据本地视频文件的path来上传
  • YxYYxY:作者您好,请问一下有Alamofire的类似您这种的库吗?刚学swift,oc一直用的你这个,求推荐个swift的,谢谢
    jkpang:@YxYYxY 在GitHub 上你搜索一下Moya ,这是对Alamofire的高度封装,你可以试下。不过我还没用过
  • aiq西米: 手动配置的依赖库都不说一下,你的框架依赖别人的框架

    Link with required frameworks:
    UIKit
    CoreFoundation
    QuartzCore
    sqlite3
    jkpang:@aiq西米 忘记说了,我会尽快补上哈:smile:
  • 相敬如冰:大神,今天用遇到个奇怪的问题,就是用你封装的get请求没问题,用post请求 ,因为有分页需求,我设置的是每次请求10条数据,但是POST无论是带不带缓存,请求的数据都是四百多条,请问这种情况有过吗
    jkpang:@相敬如冰 请求的URL应为 ? 前部分, 参数为 ? 后部分 ,应该这样写: https://request.zttmall.com/tools/interface.ashx
    NSMutableDictionary *param = [NSMutableDictionary dictionary];
    [param setObject:@"getNewsList" forKey:@"action"];
    [param setObject:@"南通市" forKey:@"cityName"];
    [param setObject:@"" forKey:@"typeId"];
    [param setObject:@"1" forKey:@"pageNum"];
    [param setObject:@"10" forKey:@"pageCount"];
    相敬如冰:@jkpang https://request.zttmall.com/tools/interface.ashx?action=getNewsList
    NSMutableDictionary *param = [NSMutableDictionary dictionary];
    [param setObject:@"南通市" forKey:@"cityName"];
    [param setObject:@"" forKey:@"typeId"];
    [param setObject:@"1" forKey:@"pageNum"];
    [param setObject:@"10" forKey:@"pageCount"];
    jkpang:用POST请求,服务器会给你一次性返回400条数据是吧? 能否看下你写的请求代码
  • Jaly_xxx:是怎么实现json直接打印中文的?
    Jaly_xxx:@jkpang 👍
    jkpang:@栉雨梓林 我是新建了一个NSDictionary与NSArray的分类,在里面重写了相应的方法, 你可以进入PPNetworkHelper.m里面看到
  • brilliance_Liu:[PPNetworkHelper GET:url parameters:nil responseCache:^(id responseCache) {
    //加载缓存数据
    } success:^(id responseObject) {
    //请求成功
    } failure:^(NSError *error) {
    //请求失败
    }];
    当parameters传递参数时存在无法正常存取的情况。实测
    brilliance_Liu:@jkpang 我又测了一遍,问题依旧,我暂时处理办法是只单独使用url作为key值。这里只贴出parameters中参数,URL就不贴了,因为我们网络请求有个加解密的过程。
    cityCode = "";
    latitude = "39.911510";
    longitude = "116.396746";
    pageNo = 1;
    provinceCode = "";
    rowsPerPage = 10;
    sex = "";
    sign = d138fb4a32f26878eb4a41807ab808d1;
    userToken = c99ca9233f897b6a475b616ef11fa7ba45876a26dbe30a16f3983b730ad6db5ac6f611ab67a82c118cdbc454b87fffa9a32c0b03911bf4c7f49fdf701301dda23af2ec2b15821de1ac284bd250159dd09da98019986acc33e89154f2e9f746e23d59da9756632617bf30b34fdb6d7577d1c87e8f074a6cae0373214bb245cb73;
    jkpang:@brilliance_Liu 这段时间比较忙,这周日我抽空看看.方便的话,希望你能提供给我请求的URL与参数,,,,因为在之前我经过测试时没有问题的, 非常感谢你发现的这个问题
  • 6eb1801d6996:成功、失败回调中的 ‘[[self allSessionTask] removeObject:task]‘ 线程同步有问题吧
    对_allSessionTask的操作都要使用@synchronized(self) {}
    @synchronized(self)效率低,使用dispatch_semaphore比这个好

    读取缓存操作 ’[PPNetworkCache httpCacheForURL:URL parameters:parameters]’ ,有同步I/O操作,阻塞主线程不太好吧
    755f3c191771:@jkpang 这回答我喜欢,以前常常纠结于每一行的性能问题,发现一点必要都没有,无异于带着枷锁跳舞。
    6eb1801d6996:@jkpang
    也是。
    但线程同步的问题好像还是存在
    没有设置_sessionManager的completionQueue,回调是在主线程执行,但调用那些Helper中的GET、POST方法不能保证就是在主线程,cancelAllRequest也不能保证在主线程执行,那么_allSessionTask的removeObject和addObject可能在不同的线程,_allSessionTask的操作没有线程同步的问题吗?
    jkpang:@6eb1801d6996 你说的问题我都有考虑过,但为什么还这样做?
    1、@synchronized的效率是低,但在现实中,有哪个APP会在短时间内取消网络请求1000次?10000次?再加上越来越强处理器,这点性能损耗可以忽略不计吧。比起可以忽略不计的性能损耗,我更看重的是@synchronized写法的简洁,直观,易读。

    2、与第1条的初衷一样,PPNetworkCache缓存的只是一小段的json字典数据,其大小可能都还没超过0.1KB,不会阻塞主线程吧?为了还没有超过0.1KB的字典数据,来回切换线程也不一定好吧?
  • 一个正直的小龙猫:有考虑和JsonModel 或者YYModel 在封装一层么
    jkpang:@小小小小龙猫 这个是需要自行处理的,,可以用MJExtension,YYModel,jsonModel 等json转模型框架
    一个正直的小龙猫:@jkpang 那如何请求之后 json转model呢
    jkpang:@小小小小龙猫 这个还没有考虑过,,感觉没太大必要吧
  • 默认头:xcode8?
    为什么啊 ?
    jkpang:@默认头 ????什么意思?不太懂
  • 380ad0f2110c:大神,文字和图片一起上传的时候。图片是没问题的,为什么参数一直为空的。就用这个uploadWithURL
    jkpang:@不锈钢小猪 PPNetworkHelper默认的请求参数格式为JSON, 可能你们后台规定的为二进制格式. 在请求之前你设置一下: [PPNetworkHelper setRequestSerializer:PPRequestSerializerHTTP]; 应该就可以了
    如果在使用PPNetworkHelper的过程中遇到其他问题,可以加入我最近新建的 PP-iOS学习交流群 : 323408051 交流
  • b8432f928fd2:增删改查咋搞?
    jkpang:@b8432f928fd2 比封装只有最常用的POST与GET请求,POST与GET完全可以满足增删改查等操作。PUT,DELETE等方法是直接操作服务器的数据,比较危险,除特殊情况外一般建议不使用
  • brance:大神写的很详细呀,超适合我们这些新手呀,大赞一个!
    jkpang:@Brance 大神不敢当啊,非常感谢对我的肯定!,互相学习 :smile:
  • NSLogName:DEMO有Bug,在没有网络状态下,下载按钮照样可以点击,点击之后,直接弹出下载完成。
    jkpang:@NSLogName 非常感谢你及时发现这个问题,现在这个bug已经修复好,已经更新至github,最新pod版本: 0.1.2
  • Bear_HJ:很👍 : :yum:
  • 瑞廷:在git 上看到了
    jkpang:@瑞廷 好的👌
  • 瑞廷:清除缓存,怎么做

  • 十一岁的加重:很多情况下,我们不光是缓存数据而已,通常还会涉及到缓存的失效时间的判断,我现在项目里也是这样用的直接缓存,没有考虑到缓存的失效时间,比如一天内访问都返回缓存,超过一天就重新获取缓存数据,还有种情况就是在这个缓存失效期内,但是服务器的数据变化了,你的缓存虽然没有过期但是,数据没有同步变更,求解答
    jkpang:@十一岁的加重 对你说的 "这个时候你的服务器数据变动了,也会重新下载缓存吗" 我不是太明白哈,HTTP是短连接,是不会实时知晓服务器数据的状态的,只有人为的主动发起HTTP请求才行。

    此封装发起一次网络请求+缓存的过程是这样的 :
    1.发起HTTP请求;
    2.先加载本地缓存(无论有没有缓存);
    3.HTTP请求成功/失败;
    4.加载服务器数据的同时更新本地缓存(如果HTTP请求失败就一直加载本地缓存)
    十一岁的加重:@jkpang 但是缓存的数据是会同步变更的,在每次Http请求成功后都会更新本地的数据缓存. ---每次都请求然后再缓存,这样当然缓存的数据是同步的。但是你本地有缓存,而且这个缓存在有效期内,这个时候你的服务器数据变动了,也会重新下载缓存吗,最近这些问题一直困扰着我,看了很多项目都没有涉及到缓存,缓存失效时间的处理,YTKNetworking又用的不是AFN3.0,不好处理啊
    jkpang:@十一岁的加重 你好,这个封装暂时还没有添加缓存过期时间的接口。但是缓存的数据是会同步变更的,在每次Http请求成功后都会更新本地的数据缓存.
    关于缓存的时效性这个问题你提醒的太好了,我会找时间将此接口加上去。非常感谢! :smiley:

本文标题:AFNetworking3.x与YYCache的二次封装,和FM

本文链接:https://www.haomeiwen.com/subject/rgvosttx.html