经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
详解如何使用ReactiveObjC
来源:jb51  时间:2021/6/7 13:21:46  对本文有异议

概述

RAC架构框架图

信号流程

基本使用

1、基本控件

UITextField

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

UIButton

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

计时器(interval、delay)

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

2、监听属性变化

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

3、遍历数组和字典

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

4、监听 Notification 通知事件

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

5、代替Delegate代理

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

二、RAC常用类

RACSignal

  1. RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  2. [subscriber sendNext:@"🍺🍺🍺🍺🍺🍺🍺"];
  3. [subscriber sendCompleted];
  4. return [RACDisposable disposableWithBlock:^{
  5. NSLog(@"销毁了🍺🍺🍺");
  6. }];
  7. }];
  8. [signal subscribeNext:^(id _Nullable x) {
  9. NSLog(@"%@",x);
  10. }];

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

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

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

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

  1. RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  2. [subscriber sendNext:@"signal1-->🍺🍺🍺🍺🍺🍺🍺"];
  3. [subscriber sendCompleted];
  4. return [RACDisposable disposableWithBlock:^{
  5. NSLog(@"signal1销毁了");
  6. }];
  7. }];
  8. RACMulticastConnection *connection = [signal1 publish];
  9. [connection.signal subscribeNext:^(id _Nullable x) {
  10. NSLog(@"subscribeNext-->1");
  11. }];
  12. [connection.signal subscribeNext:^(id _Nullable x) {
  13. NSLog(@"subscribeNext-->2");
  14. }];
  15. [connection.signal subscribeNext:^(id _Nullable x) {
  16. NSLog(@"subscribeNext-->3");
  17. }];
  18. [connection connect];

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

  1. NSString *input = @"执行";
  2. RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
  3. NSLog(@"input-->%@",input);
  4. return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  5. [subscriber sendNext:@"🍺🍺🍺🍺🍺🍺🍺"];
  6. [subscriber sendError:[NSError errorWithDomain:@"error" code:-1 userInfo:nil]];
  7. // [subscriber sendCompleted];
  8. return [RACDisposable disposableWithBlock:^{
  9. NSLog(@"signal销毁了");
  10. }];
  11. }];
  12. }];
  13. [command.executionSignals subscribeNext:^(RACSignal * _Nullable x) {
  14. NSLog(@"executionSignals-->%@",x);
  15. [x subscribeNext:^(id _Nullable x) {
  16. NSLog(@"executionSignals-->subscribeNext-->%@",x);
  17. }];
  18. }];
  19. [[command.executionSignals switchToLatest] subscribeNext:^(id _Nullable x) {
  20. NSLog(@"switchToLatest-->%@",x);
  21. }];
  22. [command.executing subscribeNext:^(id _Nullable x) {
  23. NSLog(@"executing-->%@",x);
  24. }];
  25. [command.errors subscribeNext:^(id _Nullable x) {
  26. NSLog(@"errors-->%@",x);
  27. }];
  28. //开始执行
  29. [command execute:input];

三、高级函数使用

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

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

  1. RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  2. [subscriber sendNext:@"signal1-->🍺🍺🍺🍺🍺🍺🍺"];
  3. [subscriber sendCompleted];
  4. return [RACDisposable disposableWithBlock:^{
  5. NSLog(@"signal1销毁了");
  6. }];
  7. }];
  8. RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  9. [subscriber sendNext:@"signal2-->🍺🍺🍺🍺🍺🍺🍺"];
  10. [subscriber sendCompleted];
  11. return [RACDisposable disposableWithBlock:^{
  12. NSLog(@"signal2销毁了");
  13. }];
  14. }];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. RACSignal *signal3 = [RACSignal combineLatest:@[signal1,signal2] reduce:^id(NSString *s1 ,NSString *s2){
  2. return [NSString stringWithFormat:@"%@ %@",s1,s2];
  3. }];
  4. [signal3 subscribeNext:^(id x) {
  5. NSLog(@"%@",x);
  6. }];

2、flattenMap & map 映射

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

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

  1. //map事例
  2. [[_textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
  3. return [NSString stringWithFormat:@"%@🍺🍺🍺🍺🍺🍺🍺",value];
  4. }] subscribeNext:^(id _Nullable x) {
  5. NSLog(@"-->%@",x);
  6. }] ;
  7. //flattenMap事例
  8. [[_textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
  9. return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  10. [subscriber sendNext:[NSString stringWithFormat:@"%@🍺🍺🍺🍺🍺🍺🍺",value]];
  11. [subscriber sendCompleted];
  12. return [RACDisposable disposableWithBlock:^(){}];
  13. }];
  14. }] subscribeNext:^(id _Nullable x) {
  15. NSLog(@"-->%@",x);
  16. }] ;

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

filter、ignore

  1. //map事例
  2. [[_textField.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
  3. return [NSString stringWithFormat:@"%@🍺🍺🍺🍺🍺🍺🍺",value];
  4. }] subscribeNext:^(id _Nullable x) {
  5. NSLog(@"-->%@",x);
  6. }] ;
  7. //flattenMap事例
  8. [[_textField.rac_textSignal flattenMap:^__kindof RACSignal * _Nullable(NSString * _Nullable value) {
  9. return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  10. [subscriber sendNext:[NSString stringWithFormat:@"%@🍺🍺🍺🍺🍺🍺🍺",value]];
  11. [subscriber sendCompleted];
  12. return [RACDisposable disposableWithBlock:^(){}];
  13. }];
  14. }] subscribeNext:^(id _Nullable x) {
  15. NSLog(@"-->%@",x);
  16. }] ;

distinctUntilChanged

  1. RACSubject *subject = [RACSubject subject];
  2. [[subject distinctUntilChanged] subscribeNext:^(id _Nullable x) {
  3. NSLog(@"-->%@",x);
  4. }];
  5. [subject sendNext:@"123"];
  6. [subject sendNext:@"123"];
  7. [subject sendNext:@"123"];
  8. [subject sendNext:@"🍺🍺🍺🍺🍺🍺"];
  9. [subject sendNext:@"🍺🍺🍺🍺🍺🍺"];
  10. [subject sendCompleted];

以上就是详解如何使用ReactiveObjC的详细内容,更多关于如何使用ReactiveObjC的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号