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

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用