美文网首页
ReactiveCocoa简单使用

ReactiveCocoa简单使用

作者: 危险地带_浅笑 | 来源:发表于2017-12-29 17:56 被阅读12次

    传统网络请求封装

    -(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<RACSubscriber>  _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<RACSubscriber>  _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简单使用

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