7.rac高级用法认知
1. flatMap. map
1.1flatMap操作在返回的时候,返回的是一个信号,而map返回的是一个值,map底层调用是flatMap,flatMap底层调用是bind函数,个人觉得这两个函数的作用就是拦截,hook(钩子思想),如果想在一个信号被接收之前对信号中的值进行修改,这时候就可以用这两个函数,一般来说flatMap不常用,map常用;而且要认识到,只要是信号,这两个函数都能拦截
2.rac中的集合
array.rac_sequence.signal 每一个集合都会有一个信号,当订阅这个信号的时候,就会遍历;用map也一样,也是需要订阅才会调用,map只是起到了一个拦截的作用
3.高级宏
RAC(self.label,text) = self.tf.rac_textSignal;绑定宏,用于将一个对象的属性和一个信号绑定起来
3.元组
RACTuple *tuple = RACTuplePack(@1,@2,@3,@4);
NSLog(@"%@ %@ %@ %@",tuple[0],tuple[1],tuple[2],tuple[3]);
元组就相当于把好几个对象打包成一个集合,然后根据下标值来取,这样就可以有多个返回值
4.contact
一个信号contact另一个信号,会形成一个新的信号,同时只有在第一个信号发送完成后sendCompleted,才会去监听第二个信号
5.then
按顺序来监听信号,而且只能获得最后一个信号的值,
[[[subject1 then:^RACSignal * _Nonnull{
return subject2;
}] then:^RACSignal * _Nonnull{
return subject3;
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
而且上一个信号必须sendCompleted,按上面来看就是能够解决嵌套问题,使代码看起来更好看,也更容易理解,比如有三个请求方法,同时设置三个信号属性,然后就可以用then来按顺序来拿取各个请求返回的数据;还有一种需求就是,第一个请求的数据是不需要展示的,但是第一个请求的数据是第二个请求的参数,第二请求的数据是要展示的,这样就可以用then,当然contact也可以
6.merge合并
[[self.subject2 merge:self.subject3] subscribeNext:^(id _Nullable x) {
}
只要任何一个信号发送就会调用,无序,并且也不用发送sendCompleted,如果想要将两个或多个信号的值在一处处理,那么就用这个方法
7.zip 合并信号,将信号发出的值变成元组,一般用于两个信号的合并,但必须要信号都发送完毕后,才会回调,而且返回值的顺序和压缩的前后顺序一致
[[signalA zipWith:signalB] subscribeNext:^(id _Nullable x) {
RACTupleUnpack(NSString *a,NSString *b) = x;
NSLog(@"%@ %@",a,b);
}];
8.combineLatest
// combineLatest:任何一个信号,只要改变就能订阅到,这就是它和zip的区别
// reduce:把多个信号的值,聚合为一个值
// reduce参数:几个信号,就几个参数,每个参数都是信号发出的值,而且reduce的block的参数值,是由自己来填写的,如果控件属性是由几个信号的值来确定的,那么就用下面的方法
如果需要操作值的话,那么就需要订阅了