1 延迟执行
[[RACScheduler mainThreadScheduler] afterDelay:10 schedule:^{ NSLog(@"延迟执行。。"); }];
2 定时器
[[RACSignal interval:5 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) { NSLog(@"间隔执行。"); }];
3 核心方法bind
- (void)bind{ // 假设想监听文本框的内容,并且在每次输出结果的时候,都在文本框的内容拼接一段文字“输出:” // 方式一:在返回结果后,拼接。 [self.textField.rac_textSignal subscribeNext:^(id x) { NSLog(@"输出:%@",x); }]; // map [[_textField.rac_textSignal map:^id(id value) { // 当源信号发出,就会调用这个block,修改源信号的内容 // 返回值:就是处理完源信号的内容。 return [NSString stringWithFormat:@"输出:%@",value]; }] subscribeNext:^(id x) { NSLog(@"%@",x); }]; }
4 concat 方法
- (void)concat{ RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@1]; [subscriber sendCompleted]; return nil; }]; RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@2]; return nil; }]; // 把signalA拼接到signalB后,signalA发送完成,signalB才会被激活。 RACSignal *concatSignal = [signalA concat:signalB]; // 以后只需要面对拼接信号开发。 // 订阅拼接的信号,不需要单独订阅signalA,signalB // 内部会自动订阅。 // 注意:第一个信号必须发送完成,第二个信号才会被激活 [concatSignal subscribeNext:^(id x) { NSLog(@"%@",x); }]; }
类似的方法还有:zipWith(信号合并) combineLatestWith(信号合并)
5 combineLatest 和reduce 的结合使用
使用案例
@weakify(self) RACSignal *signalA = self.textField.rac_textSignal; RACSignal *singalB = self.passwordField.rac_textSignal; [[RACSignal combineLatest:@[signalA,singalB] reduce:^id(NSString *account,NSString *password){ return @(account.length > 0 && password.length > 0); }] subscribeNext:^(NSNumber *x) { @strongify(self) NSLog(@"subscribeNext %@",x); self.button.enabled = x.integerValue; }];
6 双向绑定
声明一个属性
@property (nonatomic , copy) NSString *name;
创建一个label
UILabel *myL = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 50)]; myL.textColor = [UIColor lightGrayColor]; [self.view addSubview:myL];
实现绑定
RACChannelTo(myL,text,@"") = RACChannelTo(self,name); //双向绑定
这种绑定是双向的。左边的值改了右边的值也会一起改。同理右边的改了左边的也会同步修改。
RACChannelTo 中的三个参数1:对象 2:属性值 3:默认值(为null的时候默认显示的值)