RACCommand的基础使用

记录一个RACCommand常见的使用情况。

RACCommand在这里扮演的是一个执行者的角色。RACCommand带有一个命令信号RACSignal,负责做某事,比如负责请求网络数据并返回数据,并当命令执行结束时,给订阅者发送请求到的数据。command静静等等着别人发布execute信号,当别人发出execute信号,就执行。也可以绑定在按钮上,点击按钮时执行。

现在将上述情况描述成下面的代码:

RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
   return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
       NSLog(@"request server...");
       
       //模拟网络请求
       dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
           NSLog(@"success! server response with data");
           NSArray *data = @[@"abc", @"def", @"gh"];
           if (data) {
               [subscriber sendNext:data];
               [subscriber sendCompleted];
           }else{
               [subscriber sendError:nil];
           }
           
       });
       return [RACDisposable disposableWithBlock:^{
           
       }];
   }];
    
}];

[[command.executing skip:1] subscribeNext:^(NSNumber * _Nullable x) {
    BOOL isExecuting = x.boolValue;
    NSLog(@"command 是否执行:%d", isExecuting);
    if (!isExecuting) {  //网络请求结束需要的处理
        NSLog(@"end tableview refresh and reload tableview");
    }
    
}];

[command.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
    NSLog(@"%@", x);
}];

//手动代码调用
[command execute:@"start"];

//绑定到按钮的点击事件上
_requestButton.rac_command = command;

上面代码执行的输出结果:

2017-04-14 15:13:05.278 RACDemo[6268:1757471] command 是否执行:1
2017-04-14 15:13:05.278 RACDemo[6268:1757471] request server...
2017-04-14 15:13:08.278 RACDemo[6268:1757471] success! server response with data
2017-04-14 15:13:08.279 RACDemo[6268:1757471] (
    abc,
    def,
    gh
)
2017-04-14 15:13:08.279 RACDemo[6268:1757471] command 是否执行:0
2017-04-14 15:13:08.280 RACDemo[6268:1757471] end tableview refresh and reload tableview

在上面的模拟中,故意延迟了3秒再给订阅者sendNext发送消息,在控制台的输出上也是可以看到时间的间隔。由于把command绑定到了按钮的rac_command属性上,所以在每次点击按钮时,也可以发起一次网络请求。输出的结果和上面的一致。由于command中包含了一个signal,所以要取出command中的signal,需要获取command中的signal,使用executionSignals属性来获取,然后在选择其中最新的那个Signal对其订阅观察(信号中的信号),使用的方法是switchToLatest方法获取。

关于信号中的信号,可以将上面的代码中的command.executionSignals.switchToLatest替换成:

[command.executionSignals subscribeNext:^(RACSignal *  _Nullable x) {
    [x subscribeNext:^(id  _Nullable x) {
        NSLog(@"== %@", x);
    }];
}];

文章来自 http://skymonkey.cn/

高能广告区

暂无广告哦=^^=。继续看看其它文章吧!