引言

  现在由于需求的不断发展,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);
}];
    原文说:ReactiveCocoa框架使用category来为很多基本UIKit控件添加signal。这样你就能给控件添加订阅了,text field的rac_textSignal就是这么来的。 
 /**
* 过滤用户名
*/
- (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 入门学习 (一)的更多相关文章

  1. iOS ReactiveCocoa(RAC)学习详解

    概述: ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博 ...

  2. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  3. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  4. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  5. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  6. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  7. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  8. Retrofit 入门学习

    Retrofit 入门学习官方RetrofitAPI 官方的一个例子 public interface GitHubService { @GET("users/{user}/repos&qu ...

  9. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

随机推荐

  1. mysql server install

    1.首先在mysql的官网www.mysql.com或者其他网站下载mysql.zip或者mis格式的文件目前5.6的差不多300多M. 2.zip压缩包是绿色版的不用安装,直接用dos命令操作就行. ...

  2. 解决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 ...

  3. 【CSS】Intermediate2:Pseudo Classes

    1.specify a state or relation to the selector selector:pseudo_class { property: value; } 2.Link 3.Dy ...

  4. oracle之spool详细使用总结

    今天实际项目中用到了spool,发现网上好多内容不是很全,自己摸索了好半天,现在总结一下. 一.通过spool 命令,可以将select 数据库的内容写到文件中,通过在sqlplus设置一些参数,使得 ...

  5. Java 并发之共享对象

    上一篇文章说的是,避免多个线程在同一时间访问对象中的同一数据,这篇文章来详细说说共享和发布对象. 在没有同步的情况下,我们无法预料编译器.处理器安排操作执行的顺序,经常会发生以为“一定会”发生的动作实 ...

  6. MYSQL存储过程中的IN、OUT和INOUT

    MYSQL存储过程中的IN.OUT和INOUT,不能简单理解为一个方法的参数和返回值,而是面向整个过程上下文变量的. 一.MySQL 存储过程参数(in) 基本可以理解为传入function的参数,而 ...

  7. hdoj 1242 Rescue

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. MySQL 统计信息

    200 ? "200px" : this.width)!important;} --> 介绍 数据库维护统计信息的目的主要是为了优化器进行更好的执行优化,首先统计信息是建立在 ...

  9. DataTable 导出到 Excel 类

    底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...

  10. 使用dispatch_once:创建单列

    无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例是 ...