ReactiveCocoa教程

本文详细介绍了ReactiveObjC库的使用方法,包括RACSignal、RACSubject和RACReplaySubject等核心类的创建、订阅及发送信号流程。探讨了KVO、按钮监听、通知及文本内容改变的响应式编程实践,并概述了RAC中常用宏与操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.安装

pod 'ReactiveObjC', '~> 3.1.0'

2.1使用

#import "ReactiveObjC.h"

@property(nonatomic ,strong)id<RACSubscriber>subscri;

@property(nonatomic ,strong)RACSignal *signal;

  // 创建信号

    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {

        self.subscri = subscriber;

        return [RACDisposable disposableWithBlock:^{

             NSLog(@"当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。执行完Block后,当前信号就不在被订阅了。。。");

        }];

    }];

    self.signal = signal;

  // 订阅信号

    [signal subscribeNext:^(id x) {  // 发送数据:即调用sendNext时才会调用该代码块

        NSLog(@"接收数据: %@", x); // 接收数据: 123

    }];

//发送信号

  [self.subscri sendNext:@"dddd"];

//完成并结束信号

    [self.subscri sendCompleted];

self.subscri = nil;

 self.signal = nil;

信息流和订阅者

信号类继承自RACStream(流),所以信号类也是一种流,在响应式框架中一切皆是流,该类是RAC框架中最基础,最核心的类,在内部可以使用订阅者来发送 id值value、错误error、完成completed。

信号是用来被订阅的,也就是被观察的,一但数据流中的数据发生变化就能被观察到,一但观察到就会执行关联的nextBlock代码块,订阅者可以发送任意值Value、错误error、完成completed 等变化来传播

2.2:RACSubject :既能订阅信号,也能发送信号

RACSubject : 
该类继承自RACSignal,同是也遵守了RACSubscriber订阅者协议,所以该类既能订阅信号,同时也能发送信号;

// 1. 创建信号 RACSubject *subject = [RACSubject subject];

// 2. 订阅信号 [subject subscribeNext:^(id x) { NSLog(@"接收到值:%@", x); }];

// 3. 发送信号 [subject sendNext:@"123"];

2.3:RACReplaySubject类

该类继承自RACSubject类,订阅信号和发送信号的顺序没有要求,可以先订阅信号,再发送信号;也可以先发送信号再订阅信号

// 1. 创建信号 RACReplaySubject *replaySubject = [RACReplaySubject subject];

// 发送信号 [replaySubject sendNext:@"123"];

// 订阅信号 [replaySubject subscribeNext:^(id x) { NSLog(@"订阅者1接收到值:%@", x); }];

3:使用篇

3.1 KVO

// 使用该方法需要手动导入"NSObject+RACKVOWrapper.h"头文件,主头文件中并没有包含该头文件

[self.view rac_observeKeyPath:@"alpha" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {

NSLog(@"change:%@", change);

}];

3.2 监听按钮

 

[[_button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

NSLog(@"按钮被点击了:%@", x);

}];

3.3 通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) { NSLog(@"键盘即将显示");

}];

3.4 监听文本内容改变

[[textField rac_textSignal] subscribeNext:^(id x) { NSLog(@"文本框内容改变了:%@", x); }];

4.RAC中常用的宏

4.1RAC(obj, property) = signal; // 将信号发送的值赋值给某个对象的某个属性

RAC(_label, text) = _textField.rac_textSignal; //上面的代码等于下面的代码

[_textField.rac_textSignal subscribeNext:(id x){ _label.text = x; }];

4.2RACObserve(obj, property); // 返回一个信号,可以去订阅

[RACObserve(self.view, backgroundColor) subscribeNext:^(id x) { NSLog(@"x=%@", x); }]; // 上面代码是下面代码的简写形式

[[self.view rac_valuesAndChangesForKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) { NSLog(@"x:%@", x); }];

@weakify(self); 将self变成弱指针

@strongify(self); 在代码块中将self变成强指针

5:RAC常见的操作方法:操作方法位于RACSignal类中,所有信号都可以调用

  • bind(绑定)
  • flattenMap(平铺映射):底层调用的是bind
  • map(映射)
  • concat (组合-连接):拿到所有信号的值
  • then :底层调用的concat,
  • merge(合并)
  • zipWith(压缩)
  • combineLatest(聚合)
  • filter(过滤)满足条件才能订阅到值

例子:

signal = [signal filter:^BOOL(id  _Nullable value) {

        return [value length]>=2;

    }];

 

 

 

转载于:https://my.oschina.net/HeroOneHY/blog/1920289

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值