ReactiveObjC使用

一.RAC基础使用

监听方法调用

[[self rac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(id  _Nullable x) {
        NSLog(@"按钮点击");
    }];
    
    
    [[self rac_signalForSelector:@selector(innerFunc)] subscribeNext:^(id  _Nullable x) {
        NSLog(@"innerFunc");
    }];
    for (int i=0; i<5; i++) {
        [self innerFunc];
    }
    
    [[self rac_signalForSelector:@selector(viewDidAppear:)]subscribeNext:^(id  _Nullable x) {
        NSLog(@"viewDidAppear:%@",x);
    }];

KVO

//方式1
    [[self.view rac_valuesForKeyPath:@"backgroundColor" observer:self] subscribeNext:^(id  _Nullable x) {
        NSLog(@"backgroundColor1:%@",x);
    }];
    self.view.backgroundColor=[UIColor orangeColor];
    
    //方式2
    [RACObserve(self.view,backgroundColor)subscribeNext:^(id  _Nullable x) {
        NSLog(@"backgroundColor2:%@",x);
    }];
    self.view.backgroundColor=[UIColor whiteColor];

通知

[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardDidShowNotification object:self]subscribeNext:^(NSNotification * _Nullable x) {
       
        NSLog(@"监听键盘弹出通知x:%@",x);
        
    }];

监听View事件

[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(__kindof UIControl * _Nullable x) {
        
        NSLog(@"监听Button点击:x:%@",x);
    }];
    
    [[self.textfield rac_textSignal]subscribeNext:^(NSString * _Nullable x) {
        
        NSLog(@"监听TextField输入变化:x:%@",x);
    }];

监听Timer

__block int i=0;
    racdis =[[RACSignal interval:1.0 onScheduler:[RACScheduler scheduler]]subscribeNext:^(NSDate * _Nullable x) {
       
        NSLog(@"rac_tiemr:%@",x);
        i++;
        if(i==5)
        {
            [racdis dispose];
        }
        
    }];

RACSignal

RACSignal可以作为消息订阅者,但是自身不能发送消息。

RACSignal * signal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"signal"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    [signal subscribeNext:^(id x) {
        SDLog(@"signal_x:%@",x);
    }];

RACSubject

RACSubject是RACSignal的子类
RACSignal可以作为消息订阅者,同时也可以发送消息。

RACSubject * subject=[RACSubject subject];
    [subject subscribeNext:^(id x) {
        SDLog(@"subject_x:%@",x);
    }];
    [subject sendNext:@"subject"];

RACCommand

//1.创建信号
RACCommand * command=[[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) {
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"command"];
            [subscriber sendCompleted];
            return nil;
        }];
    }];
 //2.订阅信号
 [command.executionSignals.switchToLatest subscribeNext:^(id x) {
        SDLog(@"command_x:%@",x);
    }];
 //3.执行信号
 [command execute:nil];

二.RAC高级使用

distinctUntilChanged:

当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。
在开发中,刷新UI经常使用,只有两次数据不一样才需要刷新

RACSubject * subject=[RACSubject subject];
    [subject subscribeNext:^(id x) {
        SDLog(@"x=%@",x);//打印x=1 x=2 x=3 x=3 x=3
    }];
//    [[subject distinctUntilChanged] subscribeNext:^(id x) {
//        SDLog(@"x=%@",x);//打印x=1 x=2 x=3
//    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"3"];
    [subject sendNext:@"3"];

take:

从开始一共取N次的信号

RACSubject * subject=[RACSubject subject];
    //take:取前面几个值
    //在没遇到[subject sendCompleted];那么就会停止发送信号
    [[subject take:2]subscribeNext:^(id x) {
        SDLog(@"take %@",x);//打印1 2
    }];
    //takeLast:取后面多少个值,必须发送完成
    //只有[subject sendCompleted];才会发送信号
    [[subject takeLast:2]subscribeNext:^(id x) {
        SDLog(@"takeLast %@",x);//打印4 5
    }];
    
    //takeUntil:只要传入的信号发送完成或者self.rac_willDeallocSignal发送信号,就不会再接收信号的内容
    [[subject takeUntil:self.rac_willDeallocSignal]subscribeNext:^(id x) {
        SDLog(@"takeUntil %@",x);//打印1 2 3 4 5
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"4"];
    [subject sendNext:@"5"];
    [subject sendCompleted];

skip:

跳过前几个信号再开始接受信号

RACSubject * subject=[RACSubject subject];
    [[subject skip:3]subscribeNext:^(id x) {
        SDLog(@"%@",x);//打印4 5
    }];
    [subject sendNext:@"1"];
    [subject sendNext:@"2"];
    [subject sendNext:@"3"];
    [subject sendNext:@"4"];
    [subject sendNext:@"5"];
    [subject sendCompleted];

switchToLatest:

用于signalOfSignals(信号的信号),有时候信号也会发出信号,会在signalOfSignals中,获取signalOfSignals发送的最新信号

RACSubject * subject=[RACSubject subject];
    RACSubject * subject_sub1=[RACSubject subject];
    [subject.switchToLatest subscribeNext:^(id x) {
        SDLog(@"%@",x);//打印1 2
    }];
    [subject sendNext:subject_sub1];
    [subject_sub1 sendNext:@"1"];
    [subject_sub1 sendNext:@"2"];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 5,310评论 1 27
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,409评论 25 709
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 9,681评论 2 19
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,419评论 30 472
  • 今天中午放学后爸爸接上我,刚刚坐上车,妈妈就来电话了。我听见妈妈问爸爸我跳绳考试怎么样,我就接过电话告诉妈妈今天女...
    张梓墨妈妈阅读 2,701评论 0 1

友情链接更多精彩内容