看了这位哥们关于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];
}
}