美文网首页
RACCommand与RACSubject的区别

RACCommand与RACSubject的区别

作者: 炸街程序猿 | 来源:发表于2019-12-28 00:14 被阅读0次

RACCommand

是什么

  1. 定义

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

  1. 使用场景

按钮点击(按钮刚被点击、正在被点击、被点击后)

网络加载(网络正在加载、网络加载成功、网络加载失败)

怎么用

  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;

    }];

}];

  1. 执行
[command execute:nil];
  1. 订阅信号

直接订阅

[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. 定义

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

  1. 使用场景

多用于代理,相当于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];
    }
}

相关文章

网友评论

      本文标题:RACCommand与RACSubject的区别

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