美文网首页
ReactiveCoco基础应用

ReactiveCoco基础应用

作者: 我想走走 | 来源:发表于2016-12-01 14:33 被阅读47次
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UITextField *textFieldA;
    @property (weak, nonatomic) IBOutlet UITextField *textFieldB;
    
    @property (weak, nonatomic) IBOutlet UIButton *SignButton;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //ReactiveCocoa signal(RACSignal)发送事件流给它的subscriber。目前总共有三种类型的事件:next、error、completed。一个signal在因error终止或者完成前,可以发送任意数量的next事件。在本教程的第一部分,我们将会关注next事件。在第二部分,将会学习error和completed事件。
        //打印textFieldA的text;
        /*
         [self.textFieldA.rac_textSignal subscribeNext:^(id x) {
         NSLog(@"输入框的内容%@",x);
         }];
         //打印超过3个字符长度的text;filter相当于给text加了一个限制(过滤的作用)
         [self.textFieldA.rac_textSignal filter:^BOOL(id value) {
         NSString *text = value;
         return text.length>3;
         }];
         */
        /*
        //RACSignal的每个操作都会返回一个RACsignal,这在术语上叫做连贯接口(fluent interface)。这个功能可以让你直接构建管道,而不用每一步都使用本地变量
        RACSignal *textfieldASourceSignal = self.textFieldA.rac_textSignal;
        RACSignal *filteredtextFiledAA = [textfieldASourceSignal filter:^BOOL(id value) {
            NSString *text = value;
            return text.length > 3;
        }];
        [filteredtextFiledAA subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
         */
        /*
        //新加的map操作通过block改变了事件的数据。map从上一个next事件接收数据,通过执行block把返回值传给下一个next事件。在上面的代码中,map以NSString为输入,取字符串的长度,返回一个NSNumber。
        [[[self.textFieldA.rac_textSignal map:^id(NSString *text) {
            return @(text.length);
        }]
        filter:^BOOL(NSNumber *length) {
            return [length integerValue] > 3;
        }]
        subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
         */
        
        RACSignal *UserNameSignal = [self.textFieldA.rac_textSignal map:^id(NSString *text) {
            return @([self isUserName:text]);
        }];
        RACSignal *PasswordSignal = [self.textFieldB.rac_textSignal map:^id(NSString *text) {
            return @([self isPassword:text]);
        }];
        //RAC宏允许直接把信号的输出应用到对象的属性上。RAC宏有两个参数,第一个是需要设置属性值的对象,第二个是属性名。每次信号产生一个next事件,传递过来的值都会应用到该属性上。
        //设置diyigetextFiled的颜色.
        RAC(self.textFieldA, backgroundColor) = [UserNameSignal map:^id(NSNumber *usernameValue) {
            return [usernameValue boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
        }];
            
        
        //聚合这两个信号来决定登录按钮是否可用。
        RACSignal *active1 = [RACSignal combineLatest:@[UserNameSignal,PasswordSignal] reduce:^id(NSNumber *usernameValid,NSNumber *passwordValid){
            return @([usernameValid boolValue] && [passwordValid boolValue]);
            
        }];
        //将账号和密码和按钮绑定
        [active1 subscribeNext:^(NSNumber *signupAction) {
            self.SignButton.enabled = [signupAction boolValue];
        }];
        //Button点击事件
        [[self.SignButton rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {
            NSLog(@"按钮被点击了");
        }];
    }
    - (BOOL)isUserName:(NSString *)text
    {
        return NO;
    }
    - (BOOL)isPassword:(NSString *)text
    {
        if (text) {
            return YES;
        } else {
            return NO;
        }
    }
    

    相关文章

      网友评论

          本文标题:ReactiveCoco基础应用

          本文链接:https://www.haomeiwen.com/subject/zgvxmttx.html