- RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程,比如看事件有没有执行完毕
- 使用场景:监听按钮点击,网络请求
几种用法
- (void)test1 {
// RACCommand: 处理事件
// 不能返回空的信号
// 1.创建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
//block调用,执行命令的时候就会调用
NSLog(@"input=%@",input); // input 为执行命令传进来的参数
// 这里的返回值不允许为nil
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"执行命令产生的数据"];
return nil;
}];
}];
// 如何拿到执行命令中产生的数据呢?
// 订阅命令内部的信号
// ** 方式一:直接订阅执行命令返回的信号
// 2.执行命令 返回一个RACSignal
RACSignal *signal =[command execute:@2]; // 这里其实用到的是replaySubject 可以先发送命令再订阅
// 在这里就可以订阅信号了
[signal subscribeNext:^(id x) {
NSLog(@"x=%@",x);
}];
}
打印结果:input=2 x=执行命令产生的数据
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"input === %@", input);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"333"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"销毁了");
}];
}];
}];
//executionSignals:信号源,信号中信号,signalofsignals:信号,发送数据就是信号
[command.executionSignals subscribeNext:^(id x) {
//x=== RACDynamicSignal 信号
NSLog(@"x1=== %@", x);
[x subscribeNext:^(id x) {
//x 发送的信息
NSLog(@"x2=== %@", x);
}];
}];
//执行命令
[command execute:@2];
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"input === %@", input);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"333"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"销毁了");
}];
}];
}];
//switchToLatest获取最新发送的信号,只能用于信号中信号。
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
//x现在是 发送的信息
NSLog(@"x===%@",x);
}];
[command execute:@2];
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"input === %@", input);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"333"];
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"销毁了");
}];
}];
}];
//command.executing:监听事件有没有完成
[command.executing subscribeNext:^(id x) {
NSLog(@"x === %@", x);
}];
[command execute:@2];
RAC的宏定义
- RAC():把一个对象的某个属性绑定一个信号,只要发出信号,就会把信号的内容给对象的属性赋值
- RACObserve():快速的监听某个对象的某个属性改变,返回的是一个信号,对象的某个属性改变的信号
//两种写法
RAC(self.label, text) = self.textField.rac_textSignal;
[self.textField.rac_textSignal subscribeNext:^(id x) {
self.label.text = x;
}];
RAC(self.label, text) = self.textField.rac_textSignal;
//监听self.label的text属性
[RACObserve(self.label, text) subscribeNext:^(id x) {
NSLog(@"====label的文字变了");
}];
网友评论