RAC简介
RAC要解决的问题是传统ios中事件,通知,回调的机制十分的繁琐。
常规用法
target-action
- RAC可以替代一般的target-action操作,例如监测textField的文字的改变,不是用RAC的写法
1 | - (void)viewDidLoad { |
- 使用RAC的写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24- (void)viewDidLoad {
[super viewDidLoad];
UITextField *text = ({
UITextField *text = [[UITextField alloc] init];
[self.view addSubview:text];
[text mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(200, 40));
}];
text.backgroundColor = [UIColor redColor];
[[text rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 或者
//[text.rac_textSignal subscribeNext:^(id x) {
// NSLog(@"%@", x);
//}];
text;
});
}
手势中使用RAC
- RAC可以替换手势的方法,代码如下
1 | - (void)viewDidLoad { |
通知
- RAC可以代替通知,并且RAC的通知不用移出
1 | - (void)viewDidLoad { |
定制器
- RAC可以代替定时器
1 | - (void)viewDidLoad { |
代理
- RAC可以替换代理,但仅限没有返回值的代理
1 | @interface ViewController ()<UITableViewDelegate> |
KVO
- RAC可以替换KVO
1 | @interface ViewController () |
高级用法
创建信号
1 | - (void)viewDidLoad { |
信号处理
- map:映射
- filter:过滤
- delay:延时
- startWith:在接收到信号前,先接收到一个信号
1 | - (void)viewDidLoad { |
- timeout:超时
1 | RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
- take:接收到多次信号,但只处理前几次信号
- takeLast:只处理最后几次信号
- skip:忽略几次
- takeUntilBlock:返回YES可以表示不接收,返回NO表示接收该信号,与filter类似
- takeWhileBlock:当返回一次YES后,就停止接收所有信号
1 | RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
- throttle:节流,可以规定两个信号的间隔时间必须大于某个值
- distinctUntilChanged:直到订阅的内容发生变化才会处理信号
- ignore:忽略某些信号值
1 | UITextField *textField = ({ |
- flattenMap:订阅的值为一个信号,将该信号转为订阅具体的值
1 | UITextField *textField = ({ |
- repeat:重复发送某个信号
1 | RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
- merge:同时订阅两个信号源,无论哪个发出信号,都会执行
1 | RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
- combineLatest:reduce:这是一个RACSignal的类方法,表示同时聚合多个信号
1 | RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
- concat:先订阅信号A,A执行完成后再订阅信号B
1 | RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
- zipWith:两个信号都发出后,再执行,也可以使用combineLatest:
1 | RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |
RAC的坑
- side effect: 一个信号源被多个订阅者订阅,每个订阅者收到的信号可能不一样。解决方法:使用reply
1 | RACSignal *signalA = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { |