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 ...
随机推荐
- NET Office 组件Spire
高效而稳定的企业级.NET Office 组件Spire 在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是"这个系统似乎就是专门操作文档的" ...
- Sublime 将 Tab 转为空格
最近在使用 vue-cli 搭建项目,但每次用 Hbuilder 编写 vue 文件的时候,如果存在<script>部分就会报错,错误信息大意是说空格有问题.仔细研究了之后才知道,这是因为 ...
- GEOS库学习之五:与GDAL/OGR结合使用
要学习GEOS库,肯定绕不开地理方面的东西.如果需要判断的两个多边形或几何图形,不是自己创建的,而是来自shapefile文件,那就得将GEOS库和GDAL/OGR库结合使用了.实际上只需要OGR就行 ...
- 20145219 gdb调试汇编堆栈分析
20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...
- 深入探究javascript的 {} 语句块
今日学习解析json字符串,用到了一个eval()方法,解析字符串的时候为什么需要加上括号呢?摸不着头脑.原来javascript中{}语句块具有二义性,不加括号会出错,理解这种二义性对我们理解jav ...
- HoloLens开发手记 - Unity之Gaze凝视射线
凝视是HoloLens首要输入方式,形式功能类似于桌面系统的光标,用于选择操作全息对象.然而在Unity中并没有明确的Gaze API或者组件. 实现Gaze Implementing Gaze 概念 ...
- inconsistent line count calculation in projection snapshot
1.现象 在vs2013中,按Ctrl + E + D格式化.cshtml代码,vs2013系统崩溃.报:inconsistent line count calculation in projecti ...
- 服务发现:Zookeeper vs etcd vs Consul
[编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务 ...
- nhibernate入门使用经验
最近项目中用到nhibernate,学到了一点.就在这里写一点. nhibernate是java世界的hibernate的.net版本,其工作原理和hibernate一样的.我们需要用hbm的文件来描 ...
- (旧)子数涵数·PS——冷色调与LOMO
一.准备素材(我是从百度图库里下载的) 二.打开PS和素材 三.复制图层,快捷键Ctrl+J,并把原图层隐藏,只在副本上编辑(好习惯) 四.使用"匹配颜色"命令,增加"明 ...