`
iaiai
  • 浏览: 2203927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

引用

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


pod 'ReactiveObjC', '~> 3.0.0'

https://github.com/ReactiveCocoa/ReactiveObjC

1. RACSignal 信号
/* 创建信号 */
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {

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

    return nil;
}];

/* 订阅信号 */
RACDisposable *disposable = [signal subscribeNext:^(id  _Nullable x) {

    NSLog(@"信号内容:%@", x);
}];

/* 取消订阅 */
[disposable dispose];


2. RACSubject 信号

和代理的用法类似,通常用来代替代理,有了它,就不必要定义代理了。
/* 创建信号 */
RACSubject *subject = [RACSubject subject];

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

/* 订阅信号(通常在别的视图控制器中订阅,与代理的用法类似) */
[subject subscribeNext:^(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.signal subscribeNext:^(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 监听,下面表示把监听 view 的 frame 属性改变转换成信号,只要值改变就会发送信号。
[[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];
}];


持续更新,学习到新的知识在记录下来,有需要的可以收藏一下。
将来的你,一定会感激现在拼命的自己,愿自己与读者的开发之路无限美好。
  • 大小: 97.9 KB
分享到:
评论

相关推荐

    ios-MVVM RAC 学习实战 简单分享.zip

    github地址:https://github.com/sallenhandong/MVVM-RACDemo 多多star 给点动力啦 最近一直在学习RAC 所以就准备 吧常用的方法 以demo的形式 整理出来 还在学习当中 会把学到的 一点点更新 希望大家共同进步

    ios-RAC实现登录页面.zip

    在iOS开发中,ReactiveCocoa(简称RAC)是一个强大的框架,用于处理事件流和数据绑定。这个压缩包“ios-RAC实现登录页面.zip”显然包含了一个使用RAC实现登录页面的示例项目,名为“RAC_Login”。在这个项目中,...

    ios RAC 框架 demo

    iOS 开发中,ReactiveCocoa(简称RAC)是一个强大的响应式编程框架,它基于函数响应式编程的思想,将事件流和数据处理转换为可组合的信号。这个"ios RAC 框架 demo"是针对初学者设计的,旨在帮助开发者快速理解和...

    ios-RAC.zip

    标题 "ios-RAC.zip" 暗示了这个压缩包包含了一个关于iOS开发的示例项目,使用了ReactiveCocoa框架。ReactiveCocoa(RAC)是Apple平台上的一个响应式编程库,它是基于Functional Reactive Programming (FRP)理念的。...

    张星宇-东北大学-iOS开发1

    张星宇在自己的iOS开发中使用了RAC来处理异步操作。 9. Apple Store应用程序:Apple Store是一个应用程序商店,提供了大量的应用程序供用户下载。张星宇在自己的iOS开发中开发了多个应用程序,并将其发布到Apple ...

    ios-rac mvvm 简化vc.zip

    【标题】"ios-rac mvvm 简化vc.zip" 涉及的主要知识点是iOS应用开发中的架构模式——ReactiveCocoa(RAC)和Model-View-ViewModel(MVVM),以及如何利用这些技术来简化ViewController(VC)的管理。 **...

    iOS-RAC-实际开发案例-登录注册-Demo

    在iOS应用开发中,ReactiveCocoa(简称RAC)是一种强大的响应式编程框架,它源自于函数式编程思想,并且被广泛应用于处理事件流、数据流和UI更新。在这个"iOS-RAC-实际开发案例-登录注册-Demo"中,我们将深入探讨...

    iOS MVVM开发模式 配合 RAC 信号绑定框架让开发更高效有趣.zip

    在iOS开发中,MVVM配合RAC的实践步骤: 1. **创建ViewModel**:定义ViewModel类,包含Model的数据以及业务逻辑。这些逻辑可以通过RAC信号来表示,例如`@Published`属性或`RACSubject`。 2. **数据绑定**:在View中...

    AFNetworking第三方网络数据请求类-iOS开发必备

    AFNetworking是iOS应用开发中广泛使用的第三方网络库,它为开发者提供了...在实际开发中,结合其他框架如Moya(基于AFNetworking的更高抽象)或RAC(ReactiveCocoa)进行使用,可以进一步提升代码的可读性和可维护性。

    MindNote-思维导图-iOS-RAC底层源码分析

    在iOS开发中,ReactiveCocoa(RAC)是一种强大的响应式编程框架,它引入了函数式编程的概念,帮助开发者以更简洁、声明式的方式处理事件和数据流。本分析主要聚焦于RAC的底层实现原理,通过深入源码,揭示其工作方式...

    ios-MVVM RAC之SSKit框架.zip

    SSKit是一款简易的、MVVM模式的iOS开发框架 能够快速地、动态性地配置项目,简单易学入门低,能够很轻易地解决项目中常见框架设计问题。 github地址:https://github.com/bassamyan/SSKitDemo

    iOS 组件化开发项目架构设计,结合 MVVM 设计模式 + RAC 数据绑定 + Pod 组件管理.zip

    本项目以“iOS组件化开发项目架构设计,结合MVVM设计模式+RAC数据绑定+Pod组件管理”为主题,旨在提供一种高效且灵活的开发模式。下面将详细介绍这些关键概念。 1. **组件化开发** - **目标**:组件化的主要目标是...

    iOS-RAC-高阶函数-带注释-Demo

    在iOS开发中,ReactiveCocoa(简称RAC)是一个强大的响应式编程框架,它源自于Functional Reactive Programming(FRP)的理念。RAC允许开发者通过声明式的方式处理事件和数据流,极大地提高了代码的可读性和可维护性...

    iOS 组件化开发项目架构设计,实现一套实战性的iOS组件化架构

    iOS 组件化开发项目架构设计,结合 MVVM 设计模式 + RAC 数据绑定 + Pod 组件管理, 实现一套实战性的iOS组件化架构iOS 组件化开发项目架构设计,结合 MVVM 设计模式 + RAC 数据绑定 + Pod 组件管理, 实现一套实战...

    基于MVVM的IOS开发框架EasyIOS.zip

    EasyIOS 2.0是基于MVVM编程思想进行构建的,封装了Scene,SceneModel,Model,Action四种模型来对IOS进行开发,4种模型的定义解决了IOS开发中ViewController承担了过多角色而造成的代码质量低下,使得结构思路更加...

    ios-RAC MVVM自适应高度cell.zip

    使用MVVM月RAC编写的cell自适应高度的demo

    Rac使用demo

    在"Rac使用demo"中,我们将深入探讨如何利用ReactiveCocoa进行实际的iOS应用开发。 响应式编程是一种编程范式,它允许开发者以一种声明式的方式来处理事件和数据流。在iOS开发中,这意味着你可以定义数据的变化如何...

    Oracle_RAC知识汇总.docx

    Oracle RAC,全称Real Application Clusters,是Oracle数据库的一项高级特性,旨在提供高可用性和可伸缩性。Oracle RAC允许多台服务器共享同一数据库,分担工作负载,提高系统的整体性能和容错能力。 一、Oracle ...

    iOS开发常用第三方库

    在iOS应用开发中,第三方库扮演着至关重要的角色,它们为开发者提供了丰富的功能,提高了开发效率,降低了出错的可能性。以下是一些常见的iOS开发中常用的第三方库及其详细说明: 1. **Alamofire** - Alamofire 是...

Global site tag (gtag.js) - Google Analytics