ReactiveCocoa简单使用

传统网络请求封装

-(void)requestDataWithUrl:(NSString *)url dict:(NSDictionary *)parameters andSucc:(void (^)(id response))succBlock andFail:(void (^)(NSError *error))failBlock{
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    //这里添加一些请求头,userAgent,超时时间
    [manager GET:url parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (succBlock) {
            succBlock(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if(failBlock){
            failBlock(error);
        }
    }];
}

ReactiveCocoa网络请求封装

关于传统的网络请求的封装,大家都很熟悉,这里就不再赘述了。RACMVVM完美融合,所以使用MVVM的小伙伴一旦进入RAC的世界就再也走不出来了。下面让我们一起走入他的世界吧。

-(RACSignal *)requestManagerWithUrl:(NSString *)url params:(NSDictionary *)params{
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    //这里添加一些请求头,userAgent,超时时间
    return [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
        [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary *  _Nullable responseObject) {
            [subscriber sendNext:responseObject[@"data"]];
            [subscriber sendCompleted];
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            [subscriber sendNext:error];
        }];
        return nil;
    }];
}

这里我们所有的返回结果都根据信号的方式返回了,不再需要在一个方法里面写一堆block。当然接下来讲的就是如何使用了,viewModel中处理网络请求

-(RACCommand *)requestCommand{
    if (!_requestCommand) {
        _requestCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
            return [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
                //网络请求
                [[LQNetWorkManager requestManagerWithUrl:@"" params:@{}] subscribeNext:^(id  _Nullable x) {
                    /*正常请求在这里面处理
                     *这里处理一些网络返回值 json-->model
                     *处理数据后subscriber返回
                     */
                    [subscriber sendNext:x];
                    [subscriber sendCompleted];
                } error:^(NSError * _Nullable error) {
                    [subscriber sendError:error];
                }];
                return nil;
            }];
        }];
    }
    return _requestCommand;
}

在VC中回调

- (void)viewDidLoad {
    [super viewDidLoad];
  
    [self.viewModel.requestCommand.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
        //网络请求完成
        NSLog(@"%@",x);
    }];
    
    [self.viewModel.requestCommand.errors subscribeNext:^(id  _Nullable x) {
        //网络请求出错处理
        NSLog(@"信号错误");
    }];
    
    [self.viewModel.requestCommand execute:@""];//发送网络请求
}

这样一个网络请求就完成了,未完待续

Demo

你可能感兴趣的:(ReactiveCocoa简单使用)