RAC的简单使用

2024-08-21 17:38
文章标签 简单 使用 rac

本文主要是介绍RAC的简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天是周末,临近年底,工作上遇到不可抗力,会有点一些变动!这多少会让人有一点静不下来,但需克制,Reactive Cocoa是今天的主角!

废话不多说,今天聊聊Reactive Cocoa的常见使用! 
Reactive Cocoa 是一个非常重量级一个框架,个人非常欣赏这个团队!! 
为什么说Reactive Cocoa非常的牛!! 
我们所熟知的iOS 开发中的事件包括:

  • Target
  • Delegate
  • KVO
  • 通知
  • 时钟
  • 网络异步回调 
    而 ReactiveCocoa ,就是用 信号 接管了 iOS 中的所有事件;也就意味着,用一种统一的方式来处理iOS中的所有事件,解决了各种分散的事件处理方式,显然这么一个庞大的框架学习起来也会比较难!而且如果习惯了iOS原生的编程,可能会觉得不习惯!

先看一个图: 
ReactiveCocoa特征

从这张图中,可以看出利用 信号,ReactiveCocoa接管 iOS 的所有事件,抛给开发者对事件作出三个相应反应;

可以用一张图来简要说明

next completed error

RAC 的特点

  • 通过 block 函数式 + 链式 的编程,可以让所有相关的代码继承 
    在一起!
  • 使用时需要注意循环引用,@weakify(self) / @strongify(self) 组合解除循环引用;

下面用iOS开发中常见的五种事件来说明ReactiveCocoa的常见用法! 
下载框架:

  • 新建项目
  • 进入终端,建立 Podfile,并且输入以下内容
  • # Uncomment this line to define a global platform for your project 
    platform :ios, ‘8.0’ 
  • # Uncomment this line if you’re using Swift 
    use_frameworks! 
    pod ‘ReactiveCocoa’, ‘~> 4.0.4-alpha-4’
  • 版本说明: 
    2.5 纯 OC 
    3.0 正式版支持 Swift 1.2 
    4.0 测试版支持 Swift 2.0 
    在终端输入以下命令安装框架 
    $ pod install

KVO 监听

程序实现: 监控Person name的属性变化;在touchesBegan中改变name的值,并将变化体现在UILabel上,实现KVO的监控功能; 
* 注意,RAC 的信号一旦注册不会主动释放 
* 只要在 block 中包含有 self. 一定会出现强引用 
* 需要使用 @weakify(self) / @strongify(self) 组合使用解除强引用

Person类:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end//  ViewController.m
#import "ViewController.h"
@import ReactiveCocoa;
#import "Person.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (nonatomic, strong) Person *person;
@end@implementation ViewController- (Person *)person {if (!_person) {_person = [[Person alloc] init];}return _person;
}
- (void)viewDidLoad {[super viewDidLoad];[self demoKvo];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {self.person.name = [NSString stringWithFormat:@"zhang %d",arc4random_uniform(100)];
}
- (void)demoKvo {@weakify(self)[RACObserve(self.person, name)subscribeNext:^(id x) {@strongify(self)self.nameLabel.text = x;}];
}
@end

文本框输入事件监听

#pragma -mark 文本框输入事件监听
/*** 为了测试此函数,增加了一个nameText;监听文本框的输入内容,并设置为self.person.name*/
- (void)demoTextField {@weakify(self);//创建一个冷信号 使用subscribeNext订阅一个信号[[self.nameText rac_textSignal]subscribeNext:^(id x) {@strongify(self);NSLog(@"%@",x);self.person.name = x;}];
}

文本框组合信号

#pragma -mark 文本信号组合
/*** 为了验证此函数,增加了一个passwordText和一个Button,监测nameText和passwordText* 根据状态是否enabled*/
- (void)textFileCombination {id signals = @[[self.nameText rac_textSignal],[self.passWordText rac_textSignal]];@weakify(self);[[RACSignalcombineLatest:signals]subscribeNext:^(RACTuple *x) {@strongify(self);NSString *name = [x first];NSString *password = [x second];if (name.length > 0 && password.length > 0) {self.loginButton.enabled = YES;self.person.name = name;self.person.password = password;} else  {self.loginButton.enabled = NO;}}];
}

按钮监听

#pragma -mark 按钮监听
/*** 验证此函数:当loginButton可以点击时,点击button输出person的属性,实现监控的效果*/
- (void)buttonDemo {@weakify(self);[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {@strongify(self);NSLog(@"person.name:  %@    person.password:  %@",self.person.name,self.person.password);}];
}

代理方法

#pragma -mark 代理方法
/*** 5、验证此函:nameText的输入字符时,输入回撤或者点击键盘的回车键使passWordText变为第一响应者(即输入光标移动到passWordText处)*/
- (void)delegateDemo {@weakify(self)// 1. 定义代理self.proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UITextFieldDelegate)];// 2. 代理去注册文本框的监听方法[[self.proxy rac_signalForSelector:@selector(textFieldShouldReturn:)]subscribeNext:^(id x) {@strongify(self)if (self.nameText.hasText) {[self.passWordText becomeFirstResponder];}}];self.nameText.delegate = (id<UITextFieldDelegate>)self.proxy;
}

通知

#pragma -mark 通知
/*** 验证此函数:点击textFile时,系统键盘会发送通知,打印出通知的内容*/
- (void)notificationDemo {[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillChangeFrameNotification object:nil]subscribeNext:^(id x) {NSLog(@"notificationDemo : %@", x);}];
}

看来看看这张图,会不会清晰很多?

这么一个强大的RAC,赶紧来试试吧! 
以上源码在gitHub:Demo链接 
参考资料

这篇关于RAC的简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093839

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.