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 ...
随机推荐
- java中的hashtable
好久没写博客了,这次总结一下hashtable,哈希表是我们在数据结构时候所学,在网络安全时候,老师说可以用来加密,在数据库中,可以用来当作索引. http://www.cnblogs.com/leo ...
- C++中构造函数和析构函数调用的时机
今天看书忽然对这个地方有点模糊,尤其是析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢.写段代码总结下 #include <iostream> using name ...
- ios 好去处
1.王巍的博客(我们都叫它喵神,他很萌哒) 链接:http://onevcat.com/ (难度指数:※※※※※)理由:他的swift的新书讲解的非常好,但不适合入门,进阶的话这是很适合的一本书.其他 ...
- local storage 简单应用‘’记住密码’
前些时候一直用cookie等来进行登录页面记住面膜操作,但是由于其存储容量小等缘故,所以后来转向local storage,原理为:当用户勾选记住密码时,local storage 存储用户名密码同时 ...
- tomcat热部署,更改java类不用重新加载context
修改类后,tomcat热部署会重新加载整个项目的context,影响开发效率.网上查的大多数是将server的modules标签中Auto Reload项改为Disabled,但是没有效果. 使用以下 ...
- Hyper-V虚拟化--逻辑网络、VM网络、逻辑交换机
逻辑网络承接物理网卡和VM网卡 可以关联站点.主机组.VLAN.IP子网,配置静态IP地址池(虚机的PA地址从该静态IP地址池获取) 只有当逻辑网络中的网络站点关联了VLAN后,在VM中才可以选择VL ...
- 【Android UI设计与开发】之具体解释ActionBar的使用
具体解释Android中的ActionBar的使用 请尊重他人的劳动成果,转载请注明出处:具体解释Android中的ActionBar的使用 http://blog.csdn.net/fengyuzh ...
- [ES6] 21. ESNext, ES6-Shim & Node
ES-Next: Esnextis similar to traceur, you can use command line to compile files. Install: npm instal ...
- OpenCV -- 获取轮廓照片
import cv2 img = cv2.imread( 'E:\A.jpeg' ) cv2.imshow( 'img', img ) gray = cv2.cvtColor( img, cv2.CO ...
- oc学习笔记2
.oc中的BOOL类型 oc中的BOOL类型的值为YES和NO,有点小奇怪 在oc中YES不等于1,但是NO一定等于0,所以不要把1和YES来比较 .消息发送 在oc中,经常使用这样的术语:将allo ...