美文网首页程序员iOS学习笔记iOS开发
基于RAC封装带缓存的网络请求

基于RAC封装带缓存的网络请求

作者: 浪漫恋星空 | 来源:发表于2017-09-30 14:25 被阅读309次

    写在前面

    RAC不是什么新鲜的概念了,这段时间闲来无事,就把自己项目中使用到的网络请求尝试用RAC封装了一下。

    封装网络请求

    RAC的核心是信号,在封装网络请求的过程中,把每一个网络请求封装成一个信号。

    + (RACSignal *)GET:(NSString *)url parameters:(id)parameters isCache:(BOOL)isCache;
    
    + (RACSignal *)POST:(NSString *)url parameters:(id)parameters isCache:(BOOL)isCache;
    

    项目中常用的就是这两个网络请求方法,这两个方法的实现也很简单。

    + (RACSignal *)GET:(NSString *)url parameters:(id)parameters isCache:(BOOL)isCache {
        /// 创建信号
        RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            /// 读缓存的数据
            isCache ? [subscriber sendNext:[[XKCache sharedInstance] httpCacheForURL:url parameters:parameters]] : nil;
            /// 基于AFNetworking发起网络请求
            NSURLSessionDataTask *task = [_sessionManager GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                /// 请求成功
                [subscriber sendNext:responseObject];
                
                [subscriber sendCompleted];
                /// 记录缓存数据
                isCache ? [[XKCache sharedInstance] setHttpCache:responseObject URL:url parameters:parameters] : nil;
                
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
               
                [subscriber sendError:error];
            }];
            /// 当信号被销毁的时候 取消网络请求
            return [RACDisposable disposableWithBlock:^{
                
                [task cancel];
                
            }];
        }];
        
        return signal;
    }
    

    大致的思路就是样的,网络层的封装思路参照的是PPNetworkHelper。当然,你也可以点击这里下载Demo工程,查看具体的封装细节。

    如何使用

    在需要做网络请求的地方

    RACDisposable *disposable = [[XKNetworkingManager GET:@"" parameters:nil isCache:YES] subscribeNext:^(id  _Nullable x) {
            
            // 网络请求成功  如果isCache为YES 这个block会走两次 第一次回来的是缓存数据 第二次是请求成功的数据。
            
        } error:^(NSError * _Nullable error) {
            
            // 出错
            
        } completed:^{
            
            // 信号完成 执行完这个之后信号会销毁
        }];
    

    如果想要取消这个网络请求,调用[disposable dispose]。这里有点需要注意的是,调用[task cancel]是会走AFNetworking失败的回调的。但是,在外界是收不到取消网络请求的这个失败的。因为在外界取消这个网络请求的时候是销毁的信号。信号销毁了就不会再继续发送了,所以也订阅不到了。这里不知道有没有更好的处理方式。

    特别感谢

    PPNetworkHelper

    相关文章

      网友评论

        本文标题:基于RAC封装带缓存的网络请求

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