iOS ReactiveCocoa的使用
一、ReactiveCocoa简介
二、ReactiveCocoa基本用法
(一)信号的创建、发送、接收
- //创建
- RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
- //发送信号
- [subscriber sendNext:@"oh my god"];
- //回收资源
- return [RACDisposable disposableWithBlock:^{
- NSLog(@"信号发送完成");
- }];
- }];
- //订阅信号
- [signal subscribeNext:^(id x) {
- NSLog(@"singalContent:%@", x);
- }];
(二)RAC的ControlEvents
- [[self.textField rac_signalForControlEvents:UIControlEventEditingDidBegin] subscribeNext:^(id x) {
- NSLog(@"%@", x);
- }];
这个方法便简单的实现了监听操作,并且逻辑在其后的block中处理,同样的,还能对手势进行监听:
- UITapGestureRecognizer *tap = [UITapGestureRecognizer new];
- [[tap rac_gestureSignal] subscribeNext:^(id x) {
- NSLog(@"three:%@", x);
- }];
- [self.view addGestureRecognizer:tap];
(三)RAC的KVO
- [[self.textField rac_valuesAndChangesForKeyPath:@"text" options:NSKeyValueObservingOptionNew observer:self] subscribeNext:^(id x) {
- NSLog(@"%@", x);
- }];
(四)RAC的通知
- [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(id x) {
- NSLog(@"键盘弹起");
- }];
(五)RAC的协议
- - (void)viewDidLoad {
- [super viewDidLoad];
- //代理
- self.textField.delegate = self;
- [[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(id x) {
- NSLog(@"此处打印点击信息:%@", x);
- }];
- }
- - (void)textFieldDidBeginEditing:(UITextField *)textField {
- NSLog(@"此刻开始编辑了");
- }
从协议的写法可以看出,RAC的集合程度确实很高,如果需要写多个协议分类事件的触发,RAC有着极大的优越性。
(六)RAC遍历数组和字典
- NSArray *arr = @[@"1", @"2", @"3", @"4", @"5"];
- [arr.rac_sequence.signal subscribeNext:^(id x) {
- NSLog(@"arr : %@", x);
- }];
- NSDictionary *dic = @{@"name":@"yangBo", @"age":@"19"};
- [dic.rac_sequence.signal subscribeNext:^(id x) {
- NSLog(@"dic : %@", x);
- }];
相对于枚举遍历,我还没有测试过他们的效率谁高,有兴趣的朋友可以用instruments简单测试下
(七)RAC信号处理(map、filter、combine)
(1)对信号不做处理
- [[self.textField rac_textSignal] subscribeNext:^(id x) {
- NSLog(@"doNothing:%@", x);
- }];
(2)对信号进行过滤(filter)
- [[[self.textField rac_textSignal] filter:^BOOL(NSString* value) {
- if (value.length > 3) {
- return YES;
- }
- return NO;
- }] subscribeNext:^(id x) {
- NSLog(@"filer:%@", x);
- }];
- <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">注意这个地方第一个block返回的是BOOL值,如果为NO,信号订阅者将得不到信号了(也就是第二个block不再打印值了)。</span>
(3)对信号进行映射(map)
- [[[self.textField rac_textSignal] map:^id(NSString* value) {
- if (value.length > 3) {
- return @"map now";
- }
- return value;
- }] subscribeNext:^(id x) {
- NSLog(@"map:%@", x);
- }];
映射也可以理解为转换,可以看到这里的第一个block返回的是id类型,所以如果你没有返回value,就视为信号转换,第二个block打印的值就是你return的值。
(4)信号的联合(combine)
- //创建需要联合的信号
- RACSignal *firstCombineSignal = [self.textField rac_textSignal];
- RACSignal *secondeCombineSignal = [tap rac_gestureSignal];
- //信号联合处理返回self.label的背景色
- RAC(self.label, backgroundColor) = [RACSignal combineLatest:@[firstCombineSignal, secondeCombineSignal] reduce:^id(NSString *text, UITapGestureRecognizer * tap){
- //这里进行信号逻辑判断和处理
- if (text.length == 3 && tap.state == UIGestureRecognizerStateEnded) {
- return [UIColor redColor];
- }
- return [UIColor cyanColor];
- }];
(5)信号关联
- RAC(self.label, text) = [self.textField rac_textSignal];
信号关联或联合是非常灵活的两个处理方式,在实际开发中往往能用很简单的代码实现匪夷所思的功能。
三、总结
iOS ReactiveCocoa的使用的更多相关文章
- IOS ReactiveCocoa
一 前提: 在iOS开发过程中,当某些事件响应时,需处理的某些业务逻辑 Eg. 按钮点击:action ScrollView滚动:delegate 属性值改变:KVO ReactiveCocoa为事件 ...
- [iOS]ReactiveCocoa安装方法
1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...
- iOS ReactiveCocoa(RAC)学习详解
概述: ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博 ...
- iOS ReactiveCocoa简单使用笔记
涉及对象: 两个输入框,一个按钮. 代码功能: 随时监测输入框内容的长度变化,并在输入内容不符合预设要求时,立即改变输入框背景色. 在两个输入框的内容都符合预设要求时,按钮才可用. RACSignal ...
- iOS ReactiveCocoa 最全常用API整理(可做为手册查询)
本文适合有一定RAC基础的童鞋做不时的查询,所以本文不做详细解释. 一.常见类 1.RACSiganl 信号类. RACEmptySignal :空信号,用来实现 RACSignal 的 +empty ...
- iOS Reactivecocoa(RAC)知其所以然(源码分析,一篇足以)
前言 如今RAC大行其道,对其讲解的博客也多不胜数,稍微有点经验的估计也已经对这个爽到不要不要的框架运用自如了,真正沉下来研究其实现原理的估计也不在少数,这里仅仅是记录一下自己的分析理解,更是在写这篇 ...
- iOS开发ReactiveCocoa学习笔记(六)
RAC操作方法三. demo地址:https://github.com/SummerHH/ReactiveCocoa.git doNext deliverOn timeout interval del ...
- iOS-----GitHub上比较齐全的iOS 工具和App
Github-iOS 工具 和 App 系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错- BFKit 又一套Ca ...
- iPhone Tutorials
http://www.raywenderlich.com/tutorials This site contains a ton of fun written tutorials – so many t ...
随机推荐
- FileWriter向文件中写入内容
1.创建fileWriter对象 2.写入文件信息 3.关闭流 必须关闭流,否则将不能写入文件中 /** * * @author Administrator * 文件写入对象的使用 * */ publ ...
- Mac上实现ProxyChains-NG终端代理
附上官方网站,可以自行查看:https://github.com/rofl0r/proxychains-ng 操作步骤如下: 1.在终端上用brew 安装ProxyChains-NG brew ins ...
- C#中用NPOI的excel导出
//机构表导出 private static List<User2> amininf = new BLL.Bll().GetUser2s(); //定义数据源导出对象 #region 导出 ...
- Android开发 ---SQLite数据库,lock文件,结果集游标,适配器,安全退出,给连接设置下划线,编辑器,投影,ContentValues存储,DbHelper,activity栈
目录截图: 1.activity_main.xml 主界面效果: <?xml version="1.0" encoding="utf-8"?> &l ...
- Visual Studio Code--开发大大们都在用的编辑器
老公推荐的炒鸡nb的编辑器...说让我看起来像个假大神(微笑脸) 如何用VSCode练习python呢,还有VSCode有哪些常用的功能和快捷键呢?我会持续更新中... 1. 先来换个喜欢的颜色主题吧 ...
- 积累的关于linux的安装卸载软件基本命令
Linux安装.卸载软件 在linux环境中,尤其是cenos中安装过一些软件,一般是二进制安装与源码安装,现小结一下linux中的安装与卸载. 一.通常Linux应用软件的安装包有三种: 1) ...
- Mac book Pro BootCamp驱动下载地址
https://www.drvsky.com/sort/908_1.htm 可以通过说明中的支持的独立显卡列表:,找到适合自己的版本
- 剑指Offer 25. 复杂链表的复制 (链表)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- Reactor
Flux和Mono Flux和Mono是Reactor中的两个基本概念.Flux表示的是包含0到N个元素的异步序列.在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息,序列结束的消息和序列 ...
- escu问题及解决
************************************************************** Qt 出现“undefined reference to `vtable ...