RACCommand与RACSubject的比较

看了这位哥们关于rac的文章,有所启发
然后
上代码:

RACCommand

是什么

1. 定义

RACCommand通常来处理有多种状态的信号的类

2. 使用场景

  • 按钮点击(按钮刚被点击、正在被点击、被点击后)
  • 网络加载(网络正在加载、网络加载成功、网络加载失败)

怎么用

1. 创建

用initWithSignalBlock创建,SignalBlock不能是nil,至少也得是空信号[RACSignal empty]

//创建RACCommand
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {     
        //创建信号,用来传递数据
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:(/*请求到的数据*/)];
            // 注意:数据传递完,最好调用sendCompleted,这时命令才执行完毕。
            [subscriber sendCompleted];
            return nil;
        }];
    }];

2. 执行

[command execute:nil];

3. 订阅信号

  • 直接订阅
[command.executionSignals subscribeNext:^(id x){
  //信号处理
}];
  • 用于获取信号中的信号发出的最新信号,比如下拉刷新
/*下拉刷新发送信号*/
WS(weakSelf)
tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    [weakSelf.viewModel.refreshDataCommand execute:nil];                     
}];

/*订阅信号*/
[self.refreshDataCommand.executionSignals.switchToLatest  subscribeNext:^(NSDictionary *dict){
  //对获取到的数据进行处理
}];
  • 用于检测command是否正在执行,skip表示跳过第一次信号
[[[self.refreshDataCommand.executing skip:1] take:1] subscribeNext:^(id x) {        
    if ([x isEqualToNumber:@(YES)]) {
            //正在加载
        }
}];

RACSubject

是什么

1. 定义

信号提供者,既能发送信号,又能订阅信号

2. 使用场景

多用于代理,相当于OC里的delegate或者回调block

怎么用

1. 作为代理

第一个控制器,点击按钮进入第二个控制器
- (IBAction)butClicked:(id)sender {
    SecondViewController *vc = [[SecondViewController alloc] init];
    vc.subject = [RACSubject subject];
    [vc.subject subscribeNext:^(id x) {
        NSLog(@"被通知了:%@",x);
    }];
    [self.navigationController pushViewController:towVc animated:YES];
}

第二个控制器,点击按钮通知第一个控制器
- (IBAction)btnClicked:(id)sender {
    if (self.subject) {
        [self.subject sendNext:@1];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容