iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么使用ReactiveObjC
  • 186
分享到

怎么使用ReactiveObjC

2023-06-15 09:06:55 186人浏览 独家记忆
摘要

这篇文章给大家分享的是有关怎么使用ReactiveObjC的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述RAC架构框架图信号流程基本使用1、基本控件UITextField//监听文本输入 [[_te

这篇文章给大家分享的是有关怎么使用ReactiveObjC的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

概述

RAC架构框架

怎么使用ReactiveObjC

信号流程

怎么使用ReactiveObjC

基本使用

1、基本控件

UITextField

//监听文本输入 [[_textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {        NSLog(@"%@",x); }];   //可根据自己想要监听的事件选择 [[_textField rac_signalForControlEvents:UIControlEventEditinGChanged] subscribeNext:^(__kindof UIControl * _Nullable x) {     NSLog(@"%@",x); }];//添加条件 -- 下面表示输入文字长度 > 10 时才会调用subscribeNext [[_textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {     return value.length > 10; }] subscribeNext:^(NSString * _Nullable x) {     NSLog(@"输入框内容:%@", x); }];

UIButton

//监听按钮点击事件[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {        NSLog(@"-->%@",x);}];

计时器(interval、delay)

//类似timer@weakify(self)self.disposable = [[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {        @strongify(self)        NSLog(@"时间:%@", x); // x 是当前的时间        //关闭计时器        [self.disposable dispose];}];//延时[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {        [subscriber sendNext:@"延时2秒"];        return nil;<br>}] delay:2] subscribeNext:^(id x) {                 NSLog(@"-->%@",x);}];

2、监听属性变化

//监听self的name属性[RACObserve(self, name) subscribeNext:^(id  _Nullable x) {        NSLog(@"属性的改变-->%@",x);}];[[self rac_valuesForKeyPath:@"name" observer:self] subscribeNext:^(id  _Nullable x) {        NSLog(@"属性的改变-->%@", x);}];//此处RAC宏相当于让_label订阅了_textField的文本变化信号//赋值给label的text属性RAC(_label, text) = _textField.rac_textSignal;

3、遍历数组和字典

//遍历数组 NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];[array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {      NSLog(@"内容-->%@", x)<br>}];

怎么使用ReactiveObjC

4、监听 Notification 通知事件

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"notification" object:nil] subscribeNext:^(NSNotification * _Nullable x) {        NSLog(@"-->%@", x);}];

5、代替Delegate代理

//监听按钮点击方法的信号//当执行完btnClickAction后会执行此订阅[[self rac_signalForSelector:@selector(btnClickAction:)] subscribeNext:^(RACTuple * _Nullable x) {        NSLog(@"-->%@", x);}];-(void) btnClickAction:(UIButton *)btn{    NSLog(@"按钮点击");}

二、RAC常用类

RACSignal

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

RACSubject(可发送信号也可以订阅信号)

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

//通过定值创建RACTupleRACTuple *tuple = [RACTuple tupleWithObjects:@"1", @"2", @"3", nil];//利用 RAC 宏快速封装RACTuple *tuple2 = RACTuplePack(@"1", @"2", @"3");//从别的数组中获取内容RACTuple *tuple3 = [RACTuple tupleWithObjectsFromArray:@[@"1", @"2", @"3"]]; NSLog(@"元组-->%@", tuple3[0]);NSLog(@"第一个元素-->%@", [tuple3 first]);NSLog(@"最后一个元素-->%@", [tuple3 last]);

RACMulticastConnection -- 用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block

RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {       [subscriber sendNext:@"signal1-->???????"];       [subscriber sendCompleted];       return [RACDisposable disposableWithBlock:^{           NSLog(@"signal1销毁了");       }];   }];       RACMulticastConnection *connection = [signal1 publish];       [connection.signal subscribeNext:^(id  _Nullable x) {       NSLog(@"subscribeNext-->1");   }];   [connection.signal subscribeNext:^(id  _Nullable x) {       NSLog(@"subscribeNext-->2");   }];   [connection.signal subscribeNext:^(id  _Nullable x) {       NSLog(@"subscribeNext-->3");   }];   [connection connect];

怎么使用ReactiveObjC

RACCommand -- 可以监听信号的状态等

怎么使用ReactiveObjC

NSString *input = @"执行";RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {    NSLog(@"input-->%@",input);    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {        [subscriber sendNext:@"???????"];        [subscriber sendError:[NSError errorWithDomain:@"error" code:-1 userInfo:nil]];//            [subscriber sendCompleted];        return [RACDisposable disposableWithBlock:^{            NSLog(@"signal销毁了");        }];    }];}];[command.executionSignals subscribeNext:^(RACSignal   * _Nullable x) {    NSLog(@"executionSignals-->%@",x);    [x subscribeNext:^(id  _Nullable x) {        NSLog(@"executionSignals-->subscribeNext-->%@",x);    }];}];[[command.executionSignals switchToLatest] subscribeNext:^(id  _Nullable x) {    NSLog(@"switchToLatest-->%@",x);}];[command.executing subscribeNext:^(id  _Nullable x) {    NSLog(@"executing-->%@",x);}];[command.errors subscribeNext:^(id  _Nullable x) {    NSLog(@"errors-->%@",x);}];//开始执行[command execute:input];

怎么使用ReactiveObjC

三、高级函数使用

1、连接信号、合并信号等

首先创建两个信号signal1和signal2来演示

RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {     [subscriber sendNext:@"signal1-->???????"];     [subscriber sendCompleted];     return [RACDisposable disposableWithBlock:^{         NSLog(@"signal1销毁了");     }]; }]; RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {     [subscriber sendNext:@"signal2-->???????"];     [subscriber sendCompleted];     return [RACDisposable disposableWithBlock:^{         NSLog(@"signal2销毁了");     }]; }];

1、 concat -- 当多个信号发出的时候,有顺序的接收信号

一个信号signal3去监听signal1和signal2,必须是接收signal1完后才会接收signal2

RACSignal *signal3 = [signal1 concat:signal2];  [signal3 subscribeNext:^(id  _Nullable x) {      NSLog(@"signal3-->%@",x);  }];

怎么使用ReactiveObjC

2、 combineLatestWith -- 将多个信号合并起来,并且拿到各个信号的最新的值,必须每个合并的signal至少都有过一次sendNext,才会触发合并的信号(订阅者每次接收的参数都是所有信号的最新值),不论触发哪个信号都会触发合并的信号

一个信号signal3去监听signal1和signal2,每次回调两个信号的最新值

RACSignal *signal3 = [signal1 combineLatestWith:signal2];   [signal3 subscribeNext:^(id  _Nullable x) {       NSLog(@"%@",x);   }];

怎么使用ReactiveObjC

PS:注释signal1的sendNext方法,直接销毁了,所以每个singal必须有sendNext方法

怎么使用ReactiveObjC

3、 then -- 用于连接两个信号,等待第一个信号完成,才会连接then返回的信号

RACSignal *signal3 = [signal1 then:^RACSignal * _Nonnull{    return signal2;}];[signal3 subscribeNext:^(id  _Nullable x) {    NSLog(@"signal3-->%@",x);}];

怎么使用ReactiveObjC

4、 merge -- 把多个信号合并为一个信号来监听,任何一个信号有新值的时候就会调用

一个信号signal3去监听signal1和signal2,每次回调一个信号

RACSignal *signal3 = [signal1 merge:signal2];[signal3 subscribeNext:^(id  _Nullable x) {    NSLog(@"signal3-->%@",x);}];

怎么使用ReactiveObjC

5、 zipWith -- 把两个信号压缩成一个信号,只有当两个信号都发出信号内容时,才会触发

一个信号signal3去监听signal1和signal2,但必须两个信号都有发出(不需要同时,例如signal1信号发出了,signal2信号等了10秒之后发出,那么signal3的订阅回调是等signal2信号发出的那一刻触发)

RACSignal *signal3 = [signal1 zipWith:signal2];[signal3 subscribeNext:^(id  _Nullable x) {    NSLog(@"signal3-->%@",x);}];

6、 reduce 聚合 -- 把多个信号的值按照自定义的组合返回

RACSignal *signal3 = [RACSignal combineLatest:@[signal1,signal2] reduce:^id(NSString *s1 ,NSString *s2){    return [NSString stringWithFORMat:@"%@ %@",s1,s2];}];[signal3 subscribeNext:^(id x) {    NSLog(@"%@",x);}];

怎么使用ReactiveObjC

2、flattenMap & map 映射

flattenMap 的底层实现是通过bind实现的

map 的底层实现是通过 flattenMap 实现的

怎么使用ReactiveObjC

怎么使用ReactiveObjC

//map事例[[_textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {        return [NSString stringWithFormat:@"%@???????",value];    }] subscribeNext:^(id  _Nullable x) {        NSLog(@"-->%@",x);    }] ;//flattenMap事例 [[_textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {            [subscriber sendNext:[NSString stringWithFormat:@"%@???????",value]];            [subscriber sendCompleted];            return [RACDisposable disposableWithBlock:^(){}];        }];    }] subscribeNext:^(id  _Nullable x) {        NSLog(@"-->%@",x);    }] ;

3、filter -- 过滤、ignore -- 忽略、distinctUntilChanged -- 忽略相同

filter、ignore

//map事例[[_textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {        return [NSString stringWithFormat:@"%@???????",value];    }] subscribeNext:^(id  _Nullable x) {        NSLog(@"-->%@",x);    }] ;//flattenMap事例 [[_textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {            [subscriber sendNext:[NSString stringWithFormat:@"%@???????",value]];            [subscriber sendCompleted];            return [RACDisposable disposableWithBlock:^(){}];        }];    }] subscribeNext:^(id  _Nullable x) {        NSLog(@"-->%@",x);    }] ;

distinctUntilChanged

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

怎么使用ReactiveObjC

感谢各位的阅读!关于“怎么使用ReactiveObjC”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 怎么使用ReactiveObjC

本文链接: https://www.lsjlt.com/news/279399.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在 Golang 中替换正则表达式匹配的文本?
    在 go 中,可使用 regexp.replaceall 函数替换符合正则表达式的文本,该函数需要三个参数:待替换字符串、匹配模式和替换文本。例如,将字符串中 "fox" 替换为 "do...
    99+
    2024-05-14
    golang 正则表达式
  • 如何在 Golang 中测试随机数生成器的准确性?
    在 go 中测试随机数生成器准确性的步骤包括:生成大量随机数并计算每个范围内的出现次数,以确保均匀分布。针对指定均值和标准差计算每个范围内的出现次数,以确保正态分布。 如何在 Gola...
    99+
    2024-05-14
    golang 随机数
  • 面向对象设计原则在C++中的体现
    c++++ 体现了 oop 原则,包括:封装:使用类将数据和方法封装在对象中。继承:允许派生类从基类继承数据和行为。多态:允许对象的行为根据其类型而改变,通过虚函数实现。 面向对象设计...
    99+
    2024-05-14
    c++ 面向对象
  • c语言怎么区分小数和整数
    c 语言区分小数和整数的方法有:数据类型不同:小数类型(float、double)包含小数点,整数类型(int)不包含。printf() 函数中使用不同格式化字符串:小数用 %f,整数用...
    99+
    2024-05-14
    c语言
  • 设计模式在C++ 中的可复用性和可扩展性
    在 c++++ 中,设计模式通过提供经过验证的解决方案来提高可复用性和可扩展性。可复用性允许重复使用代码,例如 factory method 模式,它支持创建不同的产品而不影响具体类。可...
    99+
    2024-05-14
    c++ 设计模式 高可扩展性
  • C++语法中函数模板的灵活运用
    C++ 语法中函数模板的灵活运用 函数模板是 C++ 中的一项强大功能,允许您创建可用于不同数据类型的一组代码。这可以提高代码的可重用性,并使您能够编写更通用、更可维护的代码。 语法 ...
    99+
    2024-05-14
    c++语法 函数模板 c++
  • c语言怎么计算字符串长度和宽度
    在 c 语言中,计算字符串长度和宽度的函数分别为:strlen() 函数用于计算字符串长度,不包括终止符 '\0'。strwidth() 函数用于计算字符串在终端中的宽度,返回显示像素数...
    99+
    2024-05-14
    c语言
  • 如何用 Golang 正则匹配多个单词或字符串?
    golang 正则表达式使用管道符 | 来匹配多个单词或字符串,将各个选项作为逻辑 or 表达式分隔开来。例如:匹配 "fox" 或 "dog":fox|dog匹配 "quick"、"b...
    99+
    2024-05-14
    golang 正则 python
  • c语言怎么跳出多层循环
    在 c 语言中,可以使用嵌套的 break 语句跳出多层循环。对于每个要跳出的循环层,都需要一个单独的 break 语句。例如:使用一个 break 语句跳出内层循环再使用一个 brea...
    99+
    2024-05-14
    c语言
  • c语言怎么注释成中文
    c语言中文注释提供两种方式:行内注释(以"//"开头)和块注释(以"/"开头并以"/"结尾)。最佳实践包括:使用简明扼要的语言,在函数和类开头处添加块注释,在关键部分添加行内注释,保持注...
    99+
    2024-05-14
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作