前言
前段时间在看Masonry这个全新的第三方的布局框架的时候,开始了解了链式编程.后来慢慢的又开始了解函数式编程和响应式编程.在这集中的编程思想下,开始接触和研究了ReactiveCocoa这个框架.在很多大神的blog中,都对这个框架有着高度的评价,各种秀自己如何灵活的使用ReactiveCocoa.今天主要就是这个框架的一些自己的学习笔记.
1.ReactiveCocoa简介
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架.
ReactiveCocoa结合了几种编程风格:
- 函数式编程(Functional Programming):使用高阶函数,例如函数用其他函数作为参数。
- 响应式编程(Reactive Programming):关注于数据流和变化传播。
ReactiveCocoa就被开发者们描述为响应式函数编程框架(FRP);使用RAC就不需要考虑调用的顺序,直接考虑结果,使得代码高聚合,方便管理.
2.ReactiveCocoa使用
2.1 RACSiganl(RAC的核心类):信号类 用来数据传递
注意点
:
- 该信号默认是一个冷信号,当值改变了,也并不会触发改信号,只有订阅了该信号,才会触发改信号.
- 订阅信号的方法:
subscribeNext:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//创建一个信号 RACSignal *singal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { //发送一个信号. [subscriber sendNext:@"Ricky"]; //如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。 [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ //信号取消 }]; }]; //订阅信号 ,激活信号 [singal subscribeNext:^(id x) { //x : 就是信号发送到数据 NSLog(@"%@",x); }]; |
2.2 替换Target和Action
- TextField的字符变化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
UITextField *textField =[[UITextField alloc]initWithFrame:CGRectMake(100, 100, 100, 40)]; textField.backgroundColor =[UIColor redColor]; [self.view addSubview:textField]; //监听UITextField的输入变化 [[textField rac_textSignal] subscribeNext:^(id x) { NSLog(@"%@",x); }]; //x就是textfield的text,所以就把id修改成NSString // [[textField rac_textSignal] subscribeNext:^(NSString * text) { // // NSLog(@"%@",text); // }]; |
- UIButton的事件的监听
1 2 3 4 5 6 7 8 9 10 11 12 13 |
UIButton *button =[UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(100, 100, 100, 100); button.backgroundColor = [UIColor yellowColor]; [self.view addSubview:button]; [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { //这个x就是button,已经知道了类型就可以把id x 修改成UIButton *button NSLog(@"%@",x); }]; |
- 手势事件
RAC的通知不需要移除,RAC会自己处理改通知的移除
1 2 3 4 |
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(id x) { NSLog(@"%@",x); }]; |
- 定时器
1 2 3 4 5 6 7 8 9 10 11 |
//延迟一定时间做某事 [[RACScheduler mainThreadScheduler]afterDelay:2 schedule:^{ NSLog(@"Ricky"); }]; //每个多长时间调用一次事件 [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) { NSLog(@"%@",x); }]; |
- KVO
监听UIScrollView的contentOffset
1 2 3 4 5 6 7 |
UIScrollView *scroller =[[UIScrollView alloc]initWithFrame:CGRectMake(100, 100, 100, 200)]; [self.view addSubview:scroller]; [RACObserve(scroller, contentOffset) subscribeNext:^(id x) { NSLog(@"%@",x); }]; |