RAC 学习笔记

作者: 一生信仰 | 来源:发表于2018-04-17 15:51 被阅读1次

    ReactiveCocoa 主要由以下四大核心组件构成:
    信号源:RACStream 及其子类;
    订阅者:RACSubscriber 的实现类及其子类;
    调度器:RACScheduler 及其子类;
    清洁工:RACDisposable 及其子类。

    image

    RACSignal

    对于一个应用来说,绝大部分的时间都是在等待某些事件的发生或响应某些状态的变化,比如用户的触摸事件、应用进入后台、网络请求成功刷新界面等等,而维护这些状态的变化,常常会使代码变得非常复杂,难以扩展。而 ReactiveCocoa 给出了一种非常好的解决方案,它使用信号来代表这些异步事件,提供了一种统一的方式来处理所有异步的行为,包括代理方法、block 回调、target-action 机制、通知、KVO 等

        //监听代理 Delegate
        [[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(id x) {
        }];
        //监听属性 KVO
        [[self.textFiled rac_valuesForKeyPath:@"textColor" observer:self] subscribeNext:^(id x) {
            NSLog(@"hasChangedColor");
        }];
        //(RAC宏)
        RAC(self.textFiled,textColor) = [self.textFiled.rac_textSignal map:^id(NSString *value) {
            return value.length>5 ? [UIColor grayColor] : [UIColor blackColor];
        }];
        
        
        //监听通知 Notification
        [[[NSNotificationCenter defaultCenter] rac_addObserverForName:AVAudioSessionRouteChangeNotification object:nil] subscribeNext:^(id x) {
        }];
        
        //按钮点击事件 UIControlEvents
        [[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
            NSLog(@"rac_signalForControlEvents");
        }];
        
        //绑定
        RAC(self,userName) = [self.textFiled.rac_textSignal map:^id(NSString *value) {
            return value;
        }];
        
        //多重绑定
        RAC(self.loginBtn,enabled) = [RACSignal  combineLatest:@[self.textFiled.rac_textSignal,self.passwordFiled.rac_textSignal] reduce:^id(NSString *account,NSString *password){
            return @(([account rangeOfString:@"@"].location != NSNotFound)&&(password.length>=6));
        }];
    

    RACSequence

    RACSequence 代表的是一个不可变的值的序列,与 RACSignal 不同,它是 pull-driven 类型的流。从严格意义上讲,RACSequence 并不能算作是信号源,因为它并不能像 RACSignal 那样,可以被订阅者订阅,但是它与 RACSignal 之间可以非常方便地进行转换。

       NSArray *strArr = @[@"12312",@"1782312",@"12",@"872462",@"8924632",@"1721@",@"98234@",@"@983845u",@"@92348",@"23@23984"];
        NSArray *filtArray = [[[strArr.rac_sequence filter:^BOOL(NSString *value) {
            return [value hasPrefix:@"1"];
        }] map:^id(NSString *value) {
            return [value stringByAppendingString:@"好"];
        }] array];
    

    参考资料:
    ReactiveCocoa v2.5 源码解析之架构总览

    相关文章

      网友评论

        本文标题:RAC 学习笔记

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