第三方地址:https://github.com/ReactiveCocoa/ReactiveCocoa
别人汇总的各个大神总结
https://github.com/ReactiveCocoaChina/ReactiveCocoaChineseResources
花了一点时间研究一下,发现确实很复杂啊,简单会了一点点皮毛,什么函数式编程啊,响应式编程啊,都太玄乎了,简单整理一下最简单的入门使用。勿喷,求教。*
简单常见使用
个人理解:
1 RACSignal 信号,带有信号值(id),可以用于处理,也可以直接用于赋值(RAC方式)。
2 注意函数式编程,大部分信号操作之后还是信号!
TextField 的rac_textSignal 是text属性变化,都会产生信号。下面拿登录简单举个栗子
- 直接处理信号
// 最简单的信号处理(类似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;
}];
- 信号值变化才产生新信号(相同赋值,不产生信号)
[[[self.nameField rac_textSignal] distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@",x);// 信号值不变时,不产生新的信号(注:用在这里不合适,只是演示,而且这个比较好用)
}];
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 用于传多个信号的值,并返回一个新的信号
另外几个写好的系统信号
- 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);
}];
其他
水平有限,其他的都不是很深入的了解。暂时用上面的常用rac,也能减少大量的代码了。对于专业的 MVVM 啊 什么的设计模式,可能还是有点举例。现在仅用于减少代码量,写成MVC了。
1