美文网首页
iOS RAC探索之(高阶函数)

iOS RAC探索之(高阶函数)

作者: qinghan | 来源:发表于2021-02-18 10:38 被阅读0次

flattenMap

把源信号的内容映射成一个新的信号,信号可以是任意类型.使用方式,如下面的代码,我们可以把txtfeild的输入的内容重新组装成新的内容

 [[self.textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
         NSString *outStr = [NSString stringWithFormat:@"输出:%@",value];
          return [RACReturnSignal return:outStr];
    }]subscribeNext:^(id  _Nullable x) {
        NSLog(@"subscribeNex:%@",x);
    }] ;

filter

顾名思义,这个可以过滤一些不满足条件的信号

    @weakify(self)
    RACSignal *signal = [self.textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        @strongify(self)
        if (self.textField.text.length>8) {
            self.textField.text = [self.textField.text substringToIndex:8];
        }
        NSLog(@"value == %@",value);
        return value.length<8;
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
        self.textField.text = x;
        
        NSLog(@"x== %@",x);
    }];

单文本输入字符串的长度大于8时,可与过滤掉

ignore

表示可以忽略某些信号

     [[self.textField.rac_textSignal ignore:@"a"] subscribeNext:^(NSString * _Nullable x) {
        NSLog(@"%@",x);
    }];

skip

    [[self.textField.rac_textSignal skip:1] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];

表示输入第一次,不会被监听到,跳过第一次发出的信号

combineLatestWith

将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号

    RACSignal *signalA = self.textField.rac_textSignal;
    RACSignal *signalB = [self.button  rac_signalForControlEvents:UIControlEventTouchUpInside];
    
    // 合并信号,任何一个信号发送数据,都能监听到.
    RACSignal *comSignal = [signalA combineLatestWith:signalB];
    
    [comSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];

reduce

通过这个函数我们对不满足条件的信号可以去掉

     RACSignal *signalA = self.textField.rac_textSignal;
    RACSignal *signalB = [self.button  rac_signalForControlEvents:UIControlEventTouchUpInside];
    @weakify(self)
    RACSignal *reduceSignal = [RACSignal combineLatest:@[signalA,signalB] reduce:^(id value1, id value2){
        @strongify(self)
        if (self.textField.text.length >8) {
            return [NSString stringWithFormat:@"reduce == %@",value1];
        }else{
            return [NSString stringWithFormat:@"reduce == %@ %@",value1,value2];
        }
    }];
    
    [reduceSignal subscribeNext:^(id  _Nullable x) {
        NSLog(@"subscribeNext == %@",x);
    }];

distinctUntilChanged

    RACSubject *subject = [RACSubject subject];
    [[subject distinctUntilChanged] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    // 发送信号
    [subject sendNext:@1];
    [subject sendNext:@2];
    [subject sendNext:@2];

当上一次的值和当前的值有明显的变化就会发出信号,否则会被忽略掉。

takeUntil

    RACSubject *subject = [RACSubject subject];
    RACSubject *subject2 = [RACSubject subject];
    [[subject takeUntil:subject2] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    // 发送信号
    [subject sendNext:@1];
    [subject sendNext:@2];
    //    [subject2 sendNext:@3];  // 1
    //    [subject2 sendCompleted]; // 或2
    [subject sendNext:@4];

给takeUntil传的是哪个信号,那么当这个信号发送信号或sendCompleted,就不能再接受源信号的内容了

takeLast

takeLast:和take的用法一样,不过它取的是最后的几个值,如下,则取的是最后两个值
注意点:takeLast 一定要调用sendCompleted,告诉他发送完成了,这样才能取到最后的几个值

     RACSubject *subject = [RACSubject subject];
    [[subject takeLast:2] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    // 发送信号
    [subject sendNext:@1];
    [subject sendNext:@2];
    [subject sendNext:@3];
    [subject sendCompleted];

相关文章

  • iOS RAC探索之(高阶函数)

    flattenMap 把源信号的内容映射成一个新的信号,信号可以是任意类型.使用方式,如下面的代码,我们可以把tx...

  • RAC高阶函数

    RAC高阶函数 0. bind bind方法使用步骤:传入一个返回值RACStreamBindBlock的bloc...

  • RXSwift 初次探索

    RXSwift的最初探索 iOS 中 我们常用到的函数式编程 oc中的RAC 和 swift中的RXSwift 是...

  • ReactiveCocoa入门笔记

    RAC是函数响应式编程思想的第三方框架 高阶函数:入参或者返回值是一个函数闭包:将外部的变量 进行捕获 RAC中的...

  • 2019-12-10

    iOS开发之RAC(一)初级篇 一、RAC是什么? 1、RAC全称:ReactiveCocoa, Github 一...

  • RAC开篇编程思想:Masory中的链式编程思想

    RAC是github开源的iOS和OS开发的框架,全称ReactiveCocoa。RAC主要应用函数响应式编程思想...

  • RAC基础

    最近接触学习到了RAC(ReactiveCocoa),RAC是函数式+响应式编程结合 我们在iOS开发中,页面之间...

  • Promise,RAC与高阶函数

    1.什么是Promise 所谓 Promise,就是JS的一个对象,用来传递异步操作结果的消息。它代表了某个未来才...

  • ReactiveCocoa的进阶

    信号的生命周期 1.RAC高阶函数 2.隐射 flattenMap 3.过滤(filter) 4.组合(combi...

  • iOS RAC探索之(使用篇)

    介绍 1.ReactiveObjC github[https://github.com/ReactiveCocoa...

网友评论

      本文标题:iOS RAC探索之(高阶函数)

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