1、常见使用
基本操作
// 最简单的信号处理(类似Next 的 还有 error,compelete 2种)
[[self.nameField rac_textSignal] subscribeNext:^(id x) {
// 文本信号值,x 。可供处理,
NSLog(@"%@",x);
}];
对信号的简单处理(过滤)
// 过滤器
[[[self.nameField rac_textSignal] filter:^BOOL(id value) {
NSString *str = value;
return @(str.length > 3);// 当满足条件时,产生信号值x,供下面处理,
}]
subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
修改信号值
[[[self.nameField rac_textSignal] map:^id(id value) {
NSString *str = value;
NSInteger len = str.length;
return [UIColor colorWithRed:len * 10. /255. green:len * 10. /255. blue:len * 10. /255. alpha:1];
// 根据原有信号值,产生新的信号值 x ,供下面处理
}]
subscribeNext:^(id x) {
NSLog(@"%@",x);
self.nameField.textColor = x;
}];
组合信号
NSArray *signals = @[self.accountTF.rac_textSignal,self.pwdTF.rac_textSignal];
//第一个参数:信号的数组 第二个参数block
//组合信号
RACSignal *combineSignal = [RACSignal combineLatest:signals reduce:^id(NSString *username,NSString *pwd){
//当用户名和密码长度都大于1时,返回yes
BOOL btnEnable = (username.length > 0 && pwd.length > 0);
return @(btnEnable);
}];
[combineSignal subscribeNext:^(id x) {
NSLog(@"%@",x);//这里订阅的是组合信号
//设置按钮的可用状态
self.loginBtn.enabled = [x boolValue];
}];
信号值变化才产生新信号(相同赋值,)
[[[self.nameField rac_textSignal] distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@",x);// 信号值不变时,不产生新的信号(注:用在这里不合适,只是演示,而且这个比较好用)
}];
2、RAC赋值
因为信号本身有信号值,但是有不能直接用,所以就有RAC()
简单赋值
RAC(self.nameField, backgroundColor) = [[self.nameField rac_textSignal] map:^id(id value) {
NSString *str = value;
NSInteger len = str.length;
return [UIColor colorWithRed:len * 10. /255. green:len * 10. /255. blue:len * 10. /255. alpha:1];//
}];// 信号本身就有值,所有使用 RAC() 宏,可以直接使用信号的值,对对象进行赋值。
多信号赋值
RAC(self.loginBtn,enabled) = [RACSignal combineLatest:@[[self.nameField rac_textSignal],[self.passwordField rac_textSignal]]
reduce:^id(NSString *name,NSString *password){
return @(name.length > 0 && password.length > 3);
}];// 多信号的联合控制,reduce 用于传多个信号的值,并返回一个新的信号
3、系统信号量
UIControl
[[self.testBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
NSNotification
// notification 监听通知信号,都不需要 add remove
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidChangeFrameNotification object:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
KVC/KVO
// KVC 所有信息
[[self.testLabel rac_valuesForKeyPath:@"text" observer:self] subscribeNext:^(id x) {
NSLog(@"value - %@",x);
}];
// KVC 选择信息
[[self.testLabel rac_valuesAndChangesForKeyPath:@"text" options:NSKeyValueObservingOptionNew observer:self] subscribeNext:^(id x) {
NSLog(@"change - %@",x);
}];
// 简写
[RACObserve(self.testLabel, text) subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
手势
// 手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[self.view addGestureRecognizer:tap];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];