ReactiveCocoa初步
[self.usernameTextField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
打印结果
-- ::50.359 RWReactivePlayground[:a0b] i
-- ::50.436 RWReactivePlayground[:a0b] is
-- ::50.541 RWReactivePlayground[:a0b] is
-- ::50.695 RWReactivePlayground[:a0b] is t
-- ::50.831 RWReactivePlayground[:a0b] is th
-- ::50.878 RWReactivePlayground[:a0b] is thi
-- ::50.901 RWReactivePlayground[:a0b] is this
-- ::51.009 RWReactivePlayground[:a0b] is this
-- ::51.142 RWReactivePlayground[:a0b] is this m
-- ::51.236 RWReactivePlayground[:a0b] is this ma
-- ::51.335 RWReactivePlayground[:a0b] is this mag
-- ::51.439 RWReactivePlayground[:a0b] is this magi
-- ::51.535 RWReactivePlayground[:a0b] is this magic
-- ::51.774 RWReactivePlayground[:a0b] is this magic?
rac_textSignal文本信号订阅,传递给下一个,打印 文本信号过滤(长度过滤)
filter:
filter:^BOOL(id value) {
NSString *text = value;
return text.length > ;
}]
[[self.usernameTextField.rac_textSignal
filter:^BOOL(id value) {
NSString *text = value;
return text.length > ;
}]
subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
打印结果
-- ::51.335 RWReactivePlayground[:a0b] is t
-- ::51.478 RWReactivePlayground[:a0b] is th
-- ::51.526 RWReactivePlayground[:a0b] is thi
-- ::51.548 RWReactivePlayground[:a0b] is this
-- ::51.676 RWReactivePlayground[:a0b] is this
-- ::51.798 RWReactivePlayground[:a0b] is this m
-- ::51.926 RWReactivePlayground[:a0b] is this ma
-- ::51.987 RWReactivePlayground[:a0b] is this mag
-- ::52.141 RWReactivePlayground[:a0b] is this magi
-- ::52.229 RWReactivePlayground[:a0b] is this magic
-- ::52.486 RWReactivePlayground[:a0b] is this magic?
可见大于三个的输入才会把输入的文本信号传递给订阅者
代码整理一下
RACSignal *usernameSourceSignal =
self.usernameTextField.rac_textSignal; RACSignal *filteredUsername = [usernameSourceSignal
filter:^BOOL(id value) {
NSString *text = value;
return text.length > ;
}]; [filteredUsername subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
订阅信号,过滤条件,传递给订阅者
[[self.usernameTextField.rac_textSignal
filter:^BOOL(id value) {
NSString *text = value; // implicit cast
return text.length > ;
}]
subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
关于id value,在此例中就是传递的字符串
可直接修改替换
[[self.usernameTextField.rac_textSignal
filter:^BOOL(NSString *text) {
return text.length > ;
}]
subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
rac_textSignal默认传递给订阅者的是文本内容,想传递其他的内容需要用到map
map:^id(NSString *text) {
return @(text.length);
}]
[[[self.usernameTextField.rac_textSignal
map:^id(NSString *text) {
return @(text.length);
}]
filter:^BOOL(NSNumber *length) {
return [length integerValue] > ;
}]
subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
传递给订阅者文本长度信号,再对这个信号进行了文本长度大于3的过滤器,最近订阅者终于订阅到了这个实时的文本输入长度信号
-- ::54.566 RWReactivePlayground[:a0b]
-- ::54.725 RWReactivePlayground[:a0b]
-- ::54.853 RWReactivePlayground[:a0b]
-- ::55.061 RWReactivePlayground[:a0b]
-- ::55.197 RWReactivePlayground[:a0b]
-- ::55.300 RWReactivePlayground[:a0b]
-- ::55.462 RWReactivePlayground[:a0b]
-- ::55.558 RWReactivePlayground[:a0b]
-- ::55.646 RWReactivePlayground[:a0b]

当我们需要用一个方法来判断输入的用户名或者密码符合要求不,一般会写个额外的方法,然后在这个方法里进行正则匹配。
那么 我们就要用这个方法来处理最初默认的文本内容信号
RACSignal *validUsernameSignal =
[self.usernameTextField.rac_textSignal
map:^id(NSString *text) {
return @([self isValidUsername:text]);
}]; RACSignal *validPasswordSignal =
[self.passwordTextField.rac_textSignal
map:^id(NSString *text) {
return @([self isValidPassword:text]);
}];
根据这个NSNumber来传递一个UIColor
[[validPasswordSignal
map:^id(NSNumber *passwordValid) {
return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}]
subscribeNext:^(UIColor *color) {
self.passwordTextField.backgroundColor = color;
}];
看着上面的代码,还行,不过RAC有个更优雅的宏来展现
RAC(self.passwordTextField, backgroundColor) =
[validPasswordSignal
map:^id(NSNumber *passwordValid) {
return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}]; RAC(self.usernameTextField, backgroundColor) =
[validUsernameSignal
map:^id(NSNumber *passwordValid) {
return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}];

通常情况下,登录一般是用户名和密码都匹配后才会在网络好的情况下登录成功。需要 进行信号混合
RACSignal *signUpActiveSignal =
[RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal]
reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid) {
return @([usernameValid boolValue] && [passwordValid boolValue]);
}];
ReactiveCocoa初步的更多相关文章
- 移动端之Android开发的几种方式的初步体验
目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...
- iOS开发之ReactiveCocoa下的MVVM(干货分享)
最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...
- CSharpGL(29)初步封装Texture和Framebuffer
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...
- Android自定义View初步
经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...
- 初步认识Node 之Node为何物
很多人即便是在使用了Node之后也不知道它到底是什么,阅读完本文你应该会有一个初步的.具体的概念了. Node的目标 提供一种简单的构建可伸缩网络程序的方法.那么,什么是可伸缩网络程序呢?可伸缩 ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- ReactiveCocoa 冷热订阅(cold subscribe, hot subscribe)
ReactiveCocoa支持两种订阅方式,一种是冷订阅,一种是热订阅. 热订阅的特点: 1.不管有没有消息订阅着,发送者总会把消息发出去. 2.不管订阅者是什么时候订阅的,发送者总是会把相同的消息发 ...
- 为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject
原文解释在这里http://cocoadocs.org/docsets/ReactiveCocoa/0.6.0/ 在标题Creating hot subscribables 底下 先贴原文: The ...
- 最快让你上手ReactiveCocoa之基础篇
前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...
随机推荐
- [资料]Keychain 获取设备唯一
BAIDU http://blog.csdn.net/wonengxing/article/details/42142595 http://www.cnblogs.com/max5945/archiv ...
- [转]hadoop hdfs常用命令
FROM : http://www.2cto.com/database/201303/198460.html hadoop hdfs常用命令 hadoop常用命令: hadoop fs 查看H ...
- [py] 导入模块 reload(sys)
#!/usr/bin/env python # coding: utf-8 import sys reload(sys) #<------这个是什么意思 sys.setdefault ...
- U3D rootMotion
Body Transform The Body Transform is the mass center of the character. It is used in Mecanim's retar ...
- Sublime 将 Tab 转为空格
最近在使用 vue-cli 搭建项目,但每次用 Hbuilder 编写 vue 文件的时候,如果存在<script>部分就会报错,错误信息大意是说空格有问题.仔细研究了之后才知道,这是因为 ...
- The ServiceClass object does not implement the required method in the following form: OMElement sayHello(OMElement e)
今天遇到一件诡异的事情,打好的同一个aar包,丢到测试环境tomcat,使用soapui测试,正常反馈结果. 丢到本地tomcat,使用soapui测试,始终报以下错误. <soapenv:En ...
- [iOS翻译]Cocoa编码规范
简介: 本文整理自Apple文档<Coding Guidelines for Cocoa>.这份文档原意是给Cocoa框架.插件及公共API开发者提供一些编码指导,实质上相当于Ap ...
- 20135208 20135212 LINUX第一次实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级: 201352 姓名:池彬宁 贺邦 学号:2013521 ...
- IOS开发之——Masonry 只支持OC,暂不支持swift
前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...
- 一个bug案例分析
Bug描述: 某大型系统的一个提供基础数据服务的子系统A进行了一次升级.升级的内容为:优化了失败重传功能,在优化的同时,开发人员发现传输数据的时间戳精度只是精确到了秒,于是顺手把精度改成了1/100秒 ...