写在前面
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失败的回调的。但是,在外界是收不到取消网络请求的这个失败的。因为在外界取消这个网络请求的时候是销毁的信号。信号销毁了就不会再继续发送了,所以也订阅不到了。这里不知道有没有更好的处理方式。
网友评论