函数响应式编程—ReactiveCocoa 使用入门

来源:互联网 发布:淘宝开店后怎么进货 编辑:程序博客网 时间:2024/05/21 19:44
  • 安装ReactiveCocoa
    新建一个OC工程,用终端进入工程目录,使用CocoaPods安装ReactiveCocoa。
    Podfile里的内容

  • 搭建一个简单的登陆界面
    简单的界面

把需要用到的空间拉成属性。准备工作就算完成了

@property (weak, nonatomic) IBOutlet UITextField *nameTextField;@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;@property (weak, nonatomic) IBOutlet UIButton *loginBtn;

- 1.初步了解一下

首先添加头文件

#import <ReactiveCocoa/ReactiveCocoa.h>

然后在ViewController里添加如下代码。

[self.nameTextField.rac_textSignal subscribeNext:^(id x) {        NSString *str = (NSString*)x;        NSLog(@"%@",str);    }];

上面的代码就是reactiveCocoa最基本的应用。可以看到,每当你输入一个字符,都会把当前的文本打印出来,不需要代理,多么简洁。
self.nameTextfield.rac_textSignal : 产生了一个文本信号,输出的信号是text文本。由于可以确定输出的信号是字符串,所以可以把(id x)改成(NSString *str)
subscribeNext 接收前面传入的信号。

2.判断输入的字符是否符合一定要求,比如长度大于3,把文本打印出来

[[self.nameTextField.rac_textSignal filter:^BOOL(NSString *str) {        return  str.length>3;    }] subscribeNext:^(NSString *x) {        NSLog(@"%@",x);    }];

上面的代码,只有你输入的字符长度超过了3,才会打印字符串。可以看到,和1比起来,多了一个filter,你可以把这个想象成一个过滤网。对于前面传过来的文本信号,要经过filter的判断,符合要求,那么信号就可以往下一级传递。

3.map 信号转换

[[[self.nameTextField.rac_textSignal map:^id(NSString *value) {        return @(value.length);    }] filter:^BOOL(NSNumber *value) {        return [value intValue]>3;    }] subscribeNext:^(NSNumber *x) {        NSLog(@"%@",x);    }];

map: 可以把前面传来的数据类型转换成其他我们需要的类型。
在上面的代码中 最开始的文本信号发送给map,map方法把文本信号转换成NSNumber类型,传给filter判断(filter的传入的变量变成了NSNumber)。filter判断成功后让map产生的信号通过,进入subscribeNext。整个信号传递的过程就是这样的。

4.输入有效的时候,改变相应输入框的背景色

RACSignal *nameTextFieldSignal = self.nameTextField.rac_textSignal;//生成一个单独的信号    RAC(self.nameTextField,backgroundColor) = [nameTextFieldSignal map:^id(NSString* value) {        return value.length>3?[UIColor yellowColor]:[UIColor whiteColor];    }];

ReactiveCocoa 提供了一个宏(RAC(TARGET, …))来更好的完成上面的事情。RAC有两个参数,第一个是目标对象,第二个是属性名,每次型号产生一个next事件,传递过来的值都会应用到该对象上。

5.两个信号合并
分别生成两个单独的信号,然后合并这两个单独的信号,根据合并后的信号来处理业务逻辑。

//两个信号RACSignal *nameSignals = self.nameTextField.rac_textSignal;    RACSignal *passwordSignal = self.passwordTextField.rac_textSignal; //改变背景色       RAC(self.nameTextField,backgroundColor) = [nameSignals map:^id(NSString* value) {        return value.length>3 ? [UIColor yellowColor]:[UIColor whiteColor] ;    }];      RAC(self.passwordTextField,backgroundColor) = [passwordSignal map:^id(NSString* value) {        return value.length>3 ? [UIColor yellowColor]:[UIColor whiteColor] ;    }];//合并两个信号    RACSignal *twoSignals = [RACSignal combineLatest:@[nameSignals,passwordSignal] reduce:^id(NSString *name,NSString* password){        return @((name.length>3)&&(password.length>3));    }];// 合并后的信号输出       [twoSignals subscribeNext:^(NSNumber *x) {        self.loginBtn.enabled = [x boolValue];    }];
0 0
原创粉丝点击