RAC 学习笔记

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使用测试Demo下载:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees阅读 11,549评论 3 10
  • RAC支持的UI控件 RACCommand RACCommand类用于表示事件的执行,一般来说是在UI上的某些动作...
    花前月下阅读 7,753评论 0 5
  • StudyForRAC github源代码地址 study for https://github.com/shua...
    Link913阅读 12,519评论 4 34
  • 前言 最近,ReactiveCocoa火的不行,网上各种大牛各种说RAC的优点,早就有学习的想法,一直没有付诸行动...
    悲伤的盖茨比阅读 7,818评论 1 2
  • Signal RAC的核心是signal,RAC世界所有的消息都是通过信号的方式传递的。 创建信号 它的内部实现是...
    咩咩sheep阅读 2,540评论 0 1