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 ...
随机推荐
- .htaccess设置静态资源缓存(即浏览器缓存)
在HTTP标头中为静态资源设置过期日期或最长存在时间,可指示浏览器从本地磁盘中加载以前下载的资源,而不是通过网络加载.这样, 网站加载速度会更快. 下面的代码都需要放到.htaccess中才能生效. ...
- U3D physics总结
物理系统基于collider, 没有collider的物体不会发生任何主动和被动的物理交互,也不会产生trigger相关消息. 当且仅当A和B都有碰撞体时,两者才有可能发生交互,才有可能产生trigg ...
- js window.open()实现打印,如何在关闭打印窗口时刷新父窗口
var childWin = window.open("your URL"); //获取子窗口句柄childWin.onunload = function(){ //onunloa ...
- Qt——右键菜单
所谓“右键菜单”,我们可以这样来看:右键+菜单.所以我们可以定义一个菜单,然后重写鼠标点击事件,令菜单在鼠标右击的时候弹出来.这种方法是可以的,但是Qt提供了一种专门用于右键菜单的方法,且看下面这个属 ...
- Activiti系列: 如何在web中使用activiti和sql server
最近要开始使用activiti结合原有的系统来开发一个专业领域内的业务管理软件,以下记录了第一次搭建该开发平台过程中所遇到的各种问题,备忘. 一.按照如下方式新建一个web工程 之所以要用 ...
- WPF Binding INotifyPropertyChanged 多线程 深入理解
例子 先来看一个例子 Person.cs public class Person : ObservableObject,INotifyPropertyChanged { private string ...
- CentOS 6.5 安装Nginx 1.7.4
一.安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc.openssl-devel.pcre-devel和zlib ...
- 20145208 实验四 Android开发基础
20145208 实验四 Android开发基础 安装Android Studio 安装的具体步骤在老师的链接中已经很详细了,在此就不做赘述了. 在此提出我觉得安装的时候需要注意的两个地方 一是安装地 ...
- WPF Command Binding
<Window x:Class="WpfTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...
- ArcGIS中的北京54和西安80投影坐标系详解
ArcGIS中的北京54和西安80投影坐标系详解 1.首先理解地理坐标系(Geographic coordinate system),Geographic coordinate system直译为地理 ...