RAC中用常见的六种应用场景,作为入门阶段的学习,有必要了解一下。
1.代替代理 主要通过RACSubject 和 rac_signalForSelector
2.代替KVO
3.监听事件
4.代替通知
5.监听文本框
6.处理界面有多次请求,需要都请求到数据时,才能展示界面
===================代替代理===============
创建一个继承自UIView的TestView类,然后在.h文件中添加一个@property(nonatomic,strong)RACSubject *btnClickSingal;属性。
.m文件中,在这个TestView上添加一个按钮,然后初始化btnClickSingal这个属性,以及添加按钮的点击事件。
#import "TestView.h"
@implementation TestView
- (RACSubject *)btnClickSingal{
if (_btnClickSingal == nil) {
_btnClickSingal = [RACSubject subject];
}
return _btnClickSingal;
}
- (IBAction)btnClick:(id)sender{
//NSLog(@"红色view监听到按钮点击");
//发送信号
[self.btnClickSingal sendNext:@"按钮被点击了"];
}
@end
在控制器中,导入TestView.h的头文件。初始化testView。并编写如下代码。
- (void)viewDidLoad {
[super viewDidLoad];
//订阅信号
[testView.btnClickSingal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
===================代替KVO===============
如果使用下面这个方法要导入头文件:#import "NSObject+RACKVOWrapper.h",监听testView的frame属性两种实现方法
[testView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
//
}];
[[_redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id x) {
//x 修改的值 NSRect
NSLog(@"%@",x);
}];
===================监听事件===============
[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {
NSLog(@"点击了按钮");
NSLog(@"%@",x);
}];
===================监听通知===============
[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
===================监听文本框===============
[_tf.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
=========有多次请求,都请求到数据时,再刷新界面=============
说明:因为一个页面可能有多个模块,可能有些模块需要在其他界面上应用到,所以电商项目通常会这样设计。假如有热销模块和最新模块,当数据都请求到的时候再去刷新界面。
- (void)viewDidLoad {
[super viewDidLoad];
//请求热销模块
RACSignal *hotSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//请求数据
NSLog(@"请求热销模块数据");
[subscriber sendNext:@"热销模块数据"];
return nil;
}];
//请求最新模块
RACSignal *newSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//请求数据
NSLog(@"请求最新模块数据");
[subscriber sendNext:@"最新模块数据"];
return nil;
}];
//数组中存放的是信号,当数组中所有的信号都发送数据的时候,才会执行Selector
/************************************************/
//方法的参数必须要和数组的信号一一对应,否则会崩溃
//发放的参数:救赎每一个信号发送的数据
[self rac_liftSelector:@selector(updateUIWithHotData:newData:) withSignalsFromArray:@[hotSignal,newSignal]];
}
- (void)updateUIWithHotData:(NSString *)hotData newData:(NSString *)newData{
//拿到请求的数据
NSLog(@"更新UI 数据:%@ 数据:%@",hotData,newData);
}