RAC

参考:https://www.jianshu.com/p/5d891caa033d

一、基本使用

RACSubject *subject = [RACSubject subject];
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"------%@",x);
    }];
    [subject sendNext:@"111"];
    
    /**1、 btn添加事件 */
    [[_btn1 rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"----subscribeNext-----%@",x);

    }];
    /**2、代替代理 监听指定方法调用,x为方法的参数 */
    [[self.hkView rac_signalForSelector:@selector(handleClickBtnWithStr:)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"----subscribeNext-----%@",x);
    }];
    /**3、 KVO */
    [self.hkView rac_observeKeyPath:@"frame" options:(NSKeyValueObservingOptionNew) observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
        NSLog(@"-------%@",value);
    }];
   /**4、代替kvo,监听属性变化 为frame设置为信号量,并订阅它 */
    [[self.hkView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id  _Nullable x) {
        NSLog(@"--__%@",x);
        }];
    [RACObserve(self.hkView, frame) subscribeNext:^(id  _Nullable x) {
        NSLog(@"----RACObserve-----%@",x);
    }];
    /**5、 通知 */
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
        NSLog(@"---------%@",x);
    }];
 /**6、 textField */
    // 监听textField的text变化
    [_textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"-----rac_textSignal----%@",x);
    }];
// 监听的textfield control事件 
    [[_textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"---------%@",x);
    }];
    // 接受满足一定条件的text改变事件 
    [[_textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
            return value.length > 3;
        }] subscribeNext:^(NSString * _Nullable x) {
            NSLog(@"---------%@",x);
        }];
 /*7、 NSTimer */
    NSThread *subThread = [[NSThread alloc] initWithBlock:^{
        NSTimer *timer1 = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
            NSLog(@"---------%@",@"111");
        }];
        [[NSRunLoop currentRunLoop] addTimer:timer1 forMode:NSRunLoopCommonModes];
        [[NSRunLoop currentRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSince1970:1]];
    }];
    [subThread start];
    // RAC应用timer
    [[RACSignal interval:1 onScheduler:[RACScheduler scheduler]] subscribeNext:^(NSDate * _Nullable x) {
        NSLog(@"----interval-----%@",x);
    }];
    // 添加延迟
    [[[RACSignal interval:1 onScheduler:[RACScheduler scheduler]] delay:2] subscribeNext:^(NSDate * _Nullable x) {
        NSLog(@"---------%@",@"dddd");
    }];

    /**8、 遍历数组 */
    NSArray *array = @[@"1", @"3"];
    [array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"---------%@",x);
    }];

二、常用的类

1、RACSignal: 信号

    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@"aadf"];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"---------%@",@"dealloc");
        }];
    }];
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"---------%@",x);
    }];

2、RACSubject:(可发送信号也可以订阅信号)
RACReplaySubject 可接受订阅前的事件

RACSubject *subject = [RACSubject subject];
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"------%@",x);
    }];
    [subject sendNext:@"111"];

    RACReplaySubject *replaySubjec = [RACReplaySubject subject];
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    [subject sendNext:@"111"];
    [subject subscribeNext:^(id  _Nullable x) {
        NSLog(@"------%@",x);
    }];

3、 RACTuple(元组): 其内部就是封装了数组,用起来跟数组差不多

    RACTuple *tuple = [RACTuple tupleWithObjects:@"1", @"3", nil];
    RACTuple *tuple2 = RACTuplePack(@"1", @"2");
    NSLog(@"---------%@",tuple.first);

4、 RACMulticastConnection: 用于当一个信号,被多次订阅时,避免多次调用创建信号中的disposableWithBlock

 
  RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
      [subscriber sendNext:@"hhhha"];
      [subscriber sendCompleted];
      return [RACDisposable disposableWithBlock:^{
          NSLog(@"---------%@",@"xiaoguole");
      }];
  }];

  RACMulticastConnection *connection = [signal1 publish];
  [connection.signal subscribeNext:^(id  _Nullable x) {
      NSLog(@"---1------%@",x);
  }];
  [connection.signal subscribeNext:^(id  _Nullable x) {
      NSLog(@"---2------%@",x);
  }];
  [connection connect];

5、 RACCommond 监听信号的状态等

    NSString *inputStr = @"执行";
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            [subscriber sendNext:@"ahahaha"];
            [subscriber sendNext:@"lalaal"];
            [subscriber sendCompleted];
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"---------%@",@"销毁了");
            }];
        }];
    }];
    
    [command.executionSignals subscribeNext:^(RACSignal *  _Nullable x) {
        NSLog(@"----executionSignals--11---%@",x);
        [x subscribeNext:^(id  _Nullable x) {
            NSLog(@"-----executionSignals--22--%@",x);
        }];
    }];
    // 当订阅了信号的信号,切换到最新的信号
    [[command.executionSignals switchToLatest] subscribeNext:^(id  _Nullable x) {
        NSLog(@"-----switchToLatest----%@",x);
    }];
    // x为1 正在执行、0已经最新完毕
    [[command.executing skip:1] subscribeNext:^(NSNumber * _Nullable x) {
        NSLog(@"----executing-----%@",x);
    }];
    // 错误进入
    [command.errors subscribeNext:^(NSError * _Nullable x) {
        NSLog(@"----errors-----%@",x);
    }];
    [command execute:inputStr];

三:高级用法

1、concat、2、combineLatestWith;3、then;4、merge;5:zipWith;6:combineLatest: reduce;7:map,flattenMap;8:filter,ignore,distinctUntilChanged,takeUntil

    RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@"1111"];
        [subscriber sendNext:@"3333"];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"---------%@",@"销毁了111");
        }];
    }];
    RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@"444"];
        [subscriber sendNext:@"2222"];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"---------%@",@"销毁了222");
        }];
    }];
    // concat: 链接两个信号,按顺序输出
    RACSignal *signal3 = [signal1 concat:signal2];
    [signal3 subscribeNext:^(id  _Nullable x) {
        NSLog(@"-----signal3----%@",x);
    }];
    // combineLatestWith: 合并两个信号,获取signal1信号的最新发送值,必须每个信号都发送值才能订阅成功
    RACSignal *signal4 = [signal1 combineLatestWith:signal2];
    [signal4 subscribeNext:^(id  _Nullable x) {
        NSLog(@"----signal4-----%@",x);
    }];
    // signal1 执行完毕了再执行then返回的signale2,signal5 = signal2
//    RACSignal *signal5 = [signal1 then:^RACSignal * _Nonnull{
//        return  signal2;
//    }];
//    [signal5 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"-----signal5----%@",x);
//    }];
    /* 打印结果:
     2021-10-21 15:29:27.770515+0800 RACProject[4188:250216] -----signal5----2222
     2021-10-21 15:29:27.770605+0800 RACProject[4188:250216] ---------销毁了222
     2021-10-21 15:29:27.770679+0800 RACProject[4188:250216] ---------销毁了111
     */
    // merge:合并两个信号,任何一个信号的值有改变就会通知接口方法
//    RACSignal *signal6 = [signal1 merge:signal2];
//    [signal6 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"----signal6-----%@",x);
//    }];
/* 打印:
RACProject[2817:40066] ----signal6-----1111
2021-10-28 09:19:50.063668+0800 RACProject[2817:40066] ----signal6-----3333
2021-10-28 09:19:50.063765+0800 RACProject[2817:40066] ---------销毁了111
2021-10-28 09:19:50.063860+0800 RACProject[2817:40066] ----signal6-----444
2021-10-28 09:19:50.063942+0800 RACProject[2817:40066] ----signal6-----2222
2021-10-28 09:19:50.064039+0800 RACProject[2817:40066] ---------销毁了222
**/
    //一个信号signal7去监听signal1和signal2,但必须两个信号都有发出(不需要同时,例如signal1信号发出了,signal2信号等了10秒之后发出,那么signal7的订阅回调是等signal2信号发出的那一刻触发),成对监听的
//    RACSignal *signal7 = [signal1 zipWith:signal2];
//    [signal7 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"-----signal7----%@",x);
//    }];
    /* 打印结果
     2021-10-21 15:39:35.280033+0800 RACProject[4332:264115] ---------销毁了111
     2021-10-21 15:39:35.280308+0800 RACProject[4332:264115] -----signal7----<RACTwoTuple: 0x600000670180> (
         1111,
         444
     )
     2021-10-21 15:39:35.280433+0800 RACProject[4332:264115] -----signal7----<RACTwoTuple: 0x60000066c380> (
         3333,
         2222
     )
     2021-10-21 15:39:35.280563+0800 RACProject[4332:264115] ---------销毁了222
     */
     
    //combineLatest: reduce: :处理接收到的signal1和signal2的值,将处理后的新值发出去
//    RACSignal *signal8 = [RACSignal combineLatest:@[signal1, signal2] reduce:^id _Nonnull(NSString *s1, NSString *s2) {
//        return [s1 stringByAppendingString:s2];
//    }];
//    [signal8 subscribeNext:^(id  _Nullable x) {
//        NSLog(@"---------%@",x);
//    }];
    /*打印结果:
     2021-10-21 15:48:51.860925+0800 RACProject[4405:272117] ---------销毁了111
     2021-10-21 15:48:51.861115+0800 RACProject[4405:272117] ---------3333444
     2021-10-21 15:48:51.861289+0800 RACProject[4405:272117] ---------33332222
     2021-10-21 15:48:51.861413+0800 RACProject[4405:272117] ---------销毁了222
     */
    // map, flattenMap 映射:处理接收到的值
//    [[_textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
//        return [value stringByAppendingString:@"aaaa"];
//        }] subscribeNext:^(id  _Nullable x) {
//            NSLog(@"---------%@",x);
//        }];
//    [[_textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
//        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
//            [subscriber sendNext:[value stringByAppendingString:@"0000"]];
//            [subscriber sendCompleted];
//            return [RACDisposable disposableWithBlock:^{
//                NSLog(@"---------%@",@"销毁掉");
//            }];
//        }];
//    }] subscribeNext:^(id  _Nullable x) {
//        NSLog(@"---------%@",x);
//    }];
    // filter: 过滤不符合的条件,ignore:忽略掉值, distinctUntilChanged: 过滤掉相同的值
    [[signal1 filter:^BOOL(NSString * _Nullable value) {
        return  [value isEqual:@"1111"];
        }] subscribeNext:^(id  _Nullable x) {
            NSLog(@"-----filter----%@",x);
        }];
    [[signal1 ignore:@"1111"] subscribeNext:^(id  _Nullable x) {
        NSLog(@"----ignore-----%@",x);
    }];
    RACSubject *subject1 = [RACSubject subject];
    [[subject1 distinctUntilChanged] subscribeNext:^(id  _Nullable x) {
        NSLog(@"----distinctUntilChanged-----%@",x);
    }];
    [subject1 sendNext:@"1"];
    [subject1 sendNext:@"1"];
    [subject1 sendNext:@"2"];
    [subject1 sendNext:@"2"];
    [subject1 sendNext:@"5"];
    [subject1 sendCompleted];
  // takeUntil:在收到signal3通知后释放前面的信号signal1, signal2
   [[[RACSignal combineLatest:@[signal1, signal2]] takeUntil:signal3] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"------signaleCombine---%@",x);
    }] ;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 前言由于公司需使用RAC+MVVM模式要写业务逻辑,对于rac菜鸡的我,不得不补习下功课,在RAC中,万物皆信号。...
    flowerflower阅读 4,930评论 19 18
  • RACSignal: 一:创建方法: + (RACSignal *)createSignal:(RACDispos...
    飞翔的青蛙王子阅读 899评论 0 2
  • RAC在iOS的实际开发中确实是一件有力的武器,此文将从以下几方面讲解 RACSignal RACSubject ...
    4b5cb36a2ee2阅读 886评论 0 0
  • 1、RACSignal // 只要订阅者调用sendNext,就会执行nextBlock // 只要订阅RACD...
    路上捡只猫阅读 848评论 0 1
  • 信号类:有数据产生的时候 RACSignal; 实质 RACDynamicSignal -> didSubscri...
    深海时代阅读 375评论 0 0