【iOS 开发】ReactiveObjC(RAC)的使用汇总

栏目: 数据库 · Oracle · 发布时间: 7年前

内容简介:【iOS 开发】ReactiveObjC(RAC)的使用汇总
【iOS 开发】ReactiveObjC(RAC)的使用汇总

RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架,能够帮我们提供大量方便的事件处理方案,让我们更简单粗暴地去处理事件,现在分为 ReactiveObjCReactiveSwift ,两个框架的功能使用相似,由于正好在学习这个然后公司项目是用 OC 写的,所以将 ReactiveObjC 的使用方法记录一下。

ReactiveObjC 的使用

RAC 的核心思想: 创建信号 - 订阅信号 - 发送信号 ,并且在 RAC 中我们会看到大量的 block ,所以在使用之前可以再重新温习一下 block 的使用。

1. RACSignal 信号

/* 创建信号 */
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber){
    
    /* 发送信号 */
    [subscribersendNext:@"发送信号"];
    
    return nil;
}];

/* 订阅信号 */
RACDisposable *disposable= [signal subscribeNext:^(id _Nullable x) {
    
    NSLog(@"信号内容:%@", x);
}];

/* 取消订阅 */
[disposabledispose];

2. RACSubject 信号

和代理的用法类似,通常用来代替代理,有了它,就不必要定义代理了。

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

/* 发送信号 */
[subjectsendNext:@"发送信号"];

/* 订阅信号(通常在别的视图控制器中订阅,与代理的用法类似) */
[subjectsubscribeNext:^(id _Nullable x) {
    
    NSLog(@"信号内容:%@", x);
}];

3. RACTuple 元祖

RAC 的元祖,跟我们 OC 的数组其实是一样的,它其实就是封装了我们 OC 的数组。

/* 创建元祖 */
RACTuple *tuple = [RACTuple tupleWithObjects:@"1", @"2", @"3", @"4", @"5", nil];

/* 从别的数组中获取内容 */
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"1", @"2", @"3", @"4", @"5"]];

/* 利用 RAC 宏快速封装 */
RACTuple *tuple = RACTuplePack(@"1", @"2", @"3", @"4", @"5");

NSLog(@"取元祖内容:%@", tuple[0]);
NSLog(@"第一个元素:%@", [tuple first]);
NSLog(@"最后一个元素:%@", [tuple last]);

4. 便利 Array 数组和 Dictionary 字典

可以省去使用 for 循环来遍历。

/* 遍历数组 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
    
    NSLog(@"数组内容:%@", x); // x 可以是任何对象
}];
/* 遍历字典 */
NSDictionary *dictionary= @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"};
[dictionary.rac_sequence.signalsubscribeNext:^(RACTuple* _Nullable x) {
    
    RACTupleUnpack(NSString *key, NSString *value) = x; // x 是一个元祖,这个宏能够将 key 和 value 拆开
    NSLog(@"字典内容:%@:%@", key, value);
}];

下面两个方法都是将数组内容全部换为 0 ,第一个是单个操作,,第二个是一次性全部替换,两个方法都不会改变原数组内容,操作完后都会生成一个新的数组,省去了创建可变数组然后遍历出来单个添加的步骤。

/* 内容操作 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
NSArray *newArray = [[array.rac_sequence map:^id _Nullable(id  _Nullable value) {
    
    NSLog(@"数组内容:%@", value);
    
    return @"0"; // 将所有内容替换为 0
    
}] array];
/* 内容快速替换 */
NSArray *array = @[@"1", @"2", @"3", @"4", @"5"];
NSArray *newArray = [[array.rac_sequence mapReplace:@"0"] array]; // 将所有内容替换为 0

5. 监听 TextField 的输入改变

可以省去设置 delegate 和实现代理方法的步骤。

/* 监听 TextField 的输入(内容改变就会调用) */
[[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
    
    NSLog(@"输入框内容:%@", x);
}];
/* 添加监听条件 */
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
    
    return value.length > 5; // 表示输入文字长度 > 5 时才会调用下面的 block
    
}] subscribeNext:^(NSString * _Nullable x) {
     
     NSLog(@"输入框内容:%@", x);
}];

6. 监听 Button 点击事件

可以省去 addTarget 添加事件和创建方法的步骤。

[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
   
    NSLog(@"%@ 按钮被点击了", x); // x 是 button 按钮对象
}];

7. 登录按钮状态实时监听

下面表示只有 用户名密码 输入框内容都大于 0 时, 登录 按钮才可以点击,而且状态是实时监听的,一句代码就能完成这个功能。

RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){

    return @(username.length && password.length);
}];

8. 监听 Notification 通知事件

可省去在 -(void)dealloc {} 中清除通知和监听通知创建方法的步骤。

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
    
    NSLog(@"%@ 键盘弹起", x); // x 是通知对象
}];

9. 代替 Delegate 代理方法

可以省去监听以及设置 delegate 的步骤,下面表示只要 view 中执行了 btnClick 这个方法,就会发送信号执行这个回调。

[[view rac_signalForSelector:@selector(btnClick)] subscribeNext:^(RACTuple * _Nullable x) {

    NSLog(@" view 中的按钮被点击了");
}];

10. 代替 KVO 监听

可以代替 KVO 监听,下面表示把监听 viewframe 属性改变转换成信号,只要值改变就会发送信号。

[[view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id  _Nullable x) {
    
    NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];

还有一种更简单的写法,就是利用 RAC 的宏,和上面的效果是一样的。

[RACObserve(view, frame) subscribeNext:^(id  _Nullable x) {
    
    NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];

11. 代替 NSTimer 计时器

可以代替 NSTimer 使用。

@interface ViewController ()

@property (nonatomic, strong) RACDisposable *disposable;

@end
/* 定义计时器监听 */
self.disposable= [[RACSignal interval:1.0 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate* _Nullable x) {
    
    NSLog(@"当前时间:%@", x); // x 是当前的系统时间
    
    /* 关闭计时器 */
    [_disposable dispose];
}];

持续更新,学习到新的知识在记录下来,有需要的可以收藏一下。

将来的你,一定会感激现在拼命的自己,愿自己与读者的开发之路无限美好。

我的传送门: 博客简书 、微博 、 GitHub


以上所述就是小编给大家介绍的《【iOS 开发】ReactiveObjC(RAC)的使用汇总》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

联盟

联盟

里德•霍夫曼、本•卡斯诺查、克里斯•叶 / 路蒙佳 / 中信出版社 / 2015-2-5 / 39.00元

在充满变化的世界,联盟潜在的合伙人 将不确定的行业转变为可掌控的职业生涯 与世界紧密连接,开创精彩的事业与未来 终生效忠于一家公司已经成为历史,我们正在经历的自由雇佣制——将员工看作自由人——无法建立创新所需的高度信任与合作的关系。 互联网时代,企业如何用全新的人才策略定义员工的忠诚?未来职业成功的秘诀是什么? 《联盟》提供了一种使雇主与员工之间从商业交易转变为互惠关......一起来看看 《联盟》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具