ReactiveCocoa 入门学习 (一)
引言
现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来学一下ReactiveCocoa框架,看看响应式编程的效果
我是从ReactiveCocoa入门教程这篇文章上下载的Demo学习的,需要pod入ReactiveCocoa框架。
核心思想:
RAC为应用中发生的不同事件流提供了一个标准接口。在ReactiveCocoa术语中这个叫做信号(signal),由RACSignal类表示。
示例使用:
导入库后,就来到演示的登录界面的.m文件中,首先用框架自然导入其头文件。
#import "RWViewController.h"
#import "RWDummySignInService.h"
//导入ReactiveCocoa库的头文件
#import "ReactiveCocoa.h"
RAC中扩展了UITextField和UITextView类,使用rac_textSignal,就可以监听用户输入的text啦。 还可以设置过滤条件,比如在输入少于4为的时候不给于显示。
//监听textField
[self.usernameTextField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"usernameTextField.text = %@", x);
}]; //密码框添加过滤条件:少于4位时不显示,过滤掉
[[self.passwordTextField.rac_textSignal filter:^BOOL(id value) {
//接受用户的输入密码
NSString * text = value;
return text.length > ;
}] subscribeNext:^(id x) {
NSLog(@"filterStr = %@", x);
}];
/**
* 过滤用户名
*/
- (void)filterRACSignalTest{ RACSignal *usernameSourceSignal = self.usernameTextField.rac_textSignal; // //对信号添加过滤的条件
// RACSignal *filteredUsername = [usernameSourceSignal filter:^BOOL(id value) {
// NSString *text = value;
// return text.length > 3;
// }];
//
// //监听过滤后的用户名打印
// [filteredUsername subscribeNext:^(id x) {
// NSLog(@"filteredUsername = %@", x);
// }]; //对信号添加过滤的条件
[[usernameSourceSignal filter:^BOOL(id value) {
NSString *text = value;
return text.length > ;
}] subscribeNext:^(id x) {
NSLog(@"filteredUsername = %@", x);
}]; }
流程借用一下原文的图:

使用subscriber来订阅需要监听对象的事件,RACSignal会发事件流给所对应的subscriber,目前总共有三种类型的事件:next、error、completed。一个signal在因error终止或者完成前,可以发送任意数量的next事件。
添加map,返回text的长度,map操作通过block改变了事件的数据:
[[[usernameSourceSignal map:^id(NSString *text) {
return @(text.length);
}] filter:^BOOL(NSNumber *length) {
return [length integerValue] > ;
}] subscribeNext:^(id x) {
NSLog(@"lenth = %@", x);
}];
可以使用map操作来把接收的对象转换成想要的类型 。

细看UITextView (RACSignalSupport) 分类中rac_textSignal的构造方法,使用block来回调,果然是响应式的。
- (RACSignal *)rac_textSignal {
@weakify(self);
RACSignal *signal = [[[[[RACSignal
defer:^{
@strongify(self);
return [RACSignal return:RACTuplePack(self)];
}]
concat:[self.rac_delegateProxy signalForSelector:@selector(textViewDidChange:)]]
reduceEach:^(UITextView *x) {
return x.text;
}]
takeUntil:self.rac_willDeallocSignal]
setNameWithFormat:@"%@ -rac_textSignal", self.rac_description];
RACUseDelegateProxy(self);
return signal;
}
这是发送next事件部分~ 附上这一部分的Demo下载。
参考文章: http://www.cocoachina.com/ios/20150123/10994.html
ReactiveCocoa 入门学习 (一)的更多相关文章
- iOS ReactiveCocoa(RAC)学习详解
概述: ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博 ...
- vue入门学习(基础篇)
vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
- Retrofit 入门学习
Retrofit 入门学习官方RetrofitAPI 官方的一个例子 public interface GitHubService { @GET("users/{user}/repos&qu ...
- MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
随机推荐
- mysql server install
1.首先在mysql的官网www.mysql.com或者其他网站下载mysql.zip或者mis格式的文件目前5.6的差不多300多M. 2.zip压缩包是绿色版的不用安装,直接用dos命令操作就行. ...
- 解决Mac下Sequel Pro 1.1 连接 Homebrew安装Mysql5.7.8的问题 Sequel Pro 1.1 encountered an unexpected error
解决Mac下Sequel Pro 1.1 连接 Homebrew安装Mysql5.7.8的问题 Sequel Pro encountered an unexpected error Sequel Pr ...
- 【CSS】Intermediate2:Pseudo Classes
1.specify a state or relation to the selector selector:pseudo_class { property: value; } 2.Link 3.Dy ...
- oracle之spool详细使用总结
今天实际项目中用到了spool,发现网上好多内容不是很全,自己摸索了好半天,现在总结一下. 一.通过spool 命令,可以将select 数据库的内容写到文件中,通过在sqlplus设置一些参数,使得 ...
- Java 并发之共享对象
上一篇文章说的是,避免多个线程在同一时间访问对象中的同一数据,这篇文章来详细说说共享和发布对象. 在没有同步的情况下,我们无法预料编译器.处理器安排操作执行的顺序,经常会发生以为“一定会”发生的动作实 ...
- MYSQL存储过程中的IN、OUT和INOUT
MYSQL存储过程中的IN.OUT和INOUT,不能简单理解为一个方法的参数和返回值,而是面向整个过程上下文变量的. 一.MySQL 存储过程参数(in) 基本可以理解为传入function的参数,而 ...
- hdoj 1242 Rescue
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- MySQL 统计信息
200 ? "200px" : this.width)!important;} --> 介绍 数据库维护统计信息的目的主要是为了优化器进行更好的执行优化,首先统计信息是建立在 ...
- DataTable 导出到 Excel 类
底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...
- 使用dispatch_once:创建单列
无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例是 ...