美文网首页
iOS 基于TMCache和AFNetworking的缓存请求类

iOS 基于TMCache和AFNetworking的缓存请求类

作者: NicoalsNC | 来源:发表于2019-10-23 16:13 被阅读0次

    最近项目空窗期,动手封装一个简便的带有缓存功能的类。主要基于第三方的TMCache和AFNetworking。

    TMCache

    TMCache 是一种键/值存储缓存系统,用于持久存储那些复制成本很高的临时对象,例如下载的数据或处理缓慢的结果。由磁盘缓存和内存缓存组成。(目前已经停止维护)

    github上的TMCache

    特点:

    • 线程安全
    • 由GCD支持
    • 如果收到内存警告或者APP进入后台, 内存缓存将被清理。
      而磁盘缓存需要手动清理,或者设置时间/大小限制
    • 能够缓存任何支持NSCoding的对象(最重要的就是UIImage),通过key存取

    TMCache由三个类构成,TMCache,TMDiskCache和TMMemoryCache。TMCache对TMDiskCache和TMMemoryCache进行了封装,其本身并未做实质的缓存工作。

    TMCache拥有一个concurrent queue,基本上所有存取对象的操作都在这个queue中进行,可以进行异步或者同步存取(异步方法是主体[两个操作同时完成才算完成],同步方法是通过信号量将异步变为同步的)

    取对象流程:

    流程图.png

    TMCache可能出现死锁,我增加了LockSignalQueueModel类,解决死锁问题,原理就是保证只有一个dispatch_queue_t

    下面讲解demo

    下载地址在这:NCDataWareModel

    demo效果.gif

    NCDataWareModel

    封装的缓存类
    通过请求url已经部分请求参数拼接做为key来存储数据

    //获取key
    - (NSString *)produceKey:(NSString *)requestFunc withOffset:(NSDictionary *)offset {
       return [[NSString stringWithFormat:@"%@%@", requestFunc, offset ? offset.description : @""] MD5];
    }
    //读取缓存
    - (void)obtainData:(NSString *)requestFunc withOffset:(NSDictionary *)offset withBlock:(TMCacheObjectBlock)blo {
       
       [self objectForKey:[self produceKey:requestFunc withOffset:offset] block:blo];
    }
    //存储缓存
    - (void)cacheData:(id<NSCoding>)data withRequestFunc:(NSString *)requestFunc withOffset:(NSDictionary *)offset {
      
       NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:data, @"data", [NSDate date], @"date",  nil];
       
       [self setObject:dic forKey:[self produceKey:requestFunc withOffset:offset] block:^(TMCache *cache, NSString *key, id object) {
     
       }];
    }
    

    RequestModel

    基于AFNetworking疯转的请求类

      NSString* url = @"supermarket/category/all/layer/products";
       NSDictionary *params = @{@"categoryId":self.selectedLeftModel.Kid,
              @"promotion":@"0",
              @"orderSort":@"0",
                                 @"orderBy":@"0",
                                 @"all":@"0"
            };
        [RequestModel requestFunc:url
                           params:params
                  withRequestType:@"GET"
                 withStartRequest:false
                    withSaveCache:true withOffset:@{@"categoryId":self.selectedLeftModel.Kid}
        success:^(id  _Nonnull response) {
          //请求成功处理
        } failure:^(NSError * _Nonnull err) {
             //请求失败处理
        }];
    
    • requstType 请求类型,”GET“ 或 ”POST“
    • startRequest 为true时,不读缓存,直接请求服务器数据
      为false时,读缓存,如果没有缓存则会请求服务器数据
    • saveCache 是否保存缓存,为true 则请求服务器数据后会保存数据
    • offset 部分入参,主要用于区分同一个请求下不同数据,比如同一个url不同id请求的不同列表

    集成

    下载demo,将工程中的NCDataWareModel拖入到工程了,如果libs文件夹下相关的第三方已经导入,替换掉就可以了。

    写的有些仓促,文章和代码若有不对地方,欢迎批评指正

    相关文章

      网友评论

          本文标题:iOS 基于TMCache和AFNetworking的缓存请求类

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