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

写在前面

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容