ReactiveCocoa框架学习<一>
1.Cocoapods导入ReactiveCocoa:
use_frameworks!
target 'RACDemo' do
pod 'ReactiveObjC', '~> 2.1.0' end
不懂得可以看这个链接: http://www.tuicool.com/articles/Qju6fme
2.输出文本内容操作:
//
// ViewController.m
// RACDemo
//
// Created by 思 彭 on 17/1/4.
// Copyright © 2017年 思 彭. All rights reserved.
// #import "ViewController.h"
#import <ReactiveObjC/ReactiveObjC.h> @interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *userNameLabel;
@property (weak, nonatomic) IBOutlet UILabel *passwordLabel;
@property (weak, nonatomic) IBOutlet UITextField *userNameTF;
@property (weak, nonatomic) IBOutlet UITextField *passwordTF; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 1.每次改变文本框中的文字,block中的代码都会执行。没有target-action,没有delegate,只有signal和block
[self.userNameTF.rac_textSignal subscribeNext:^(NSString * _Nullable x) { NSLog(@"text = %@",x);
}]; // 2.只关心超过3个字符长度的用户名
[[self.userNameTF.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
NSString *text = value;
return text.length > ;
}]
subscribeNext:^(NSString * _Nullable x) {
NSLog(@"---%@",x);
}]; // 3.上面步骤分解如下:
RACSignal *userNameSourceSignal = self.userNameTF.rac_textSignal;
RACSignal *filteredUsername = [userNameSourceSignal filter:^BOOL(id _Nullable value) { NSString *text = value;
return text.length > ;
}];
[filteredUsername subscribeNext:^(id _Nullable x) {
NSLog(@"---%@",x);
}];
} @end
3.输出文本长度操作:
// 1.输出文本长度 > 的长度:
// map操作之后的步骤收到的都是NSNumber实例。你可以使用map操作来把接收的数据转换成想要的类型,只要它是个对象。
[[[self.userNameTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
return @(value.length);
}] filter:^BOOL(id _Nullable value) {
return [value integerValue] > 3;
}] subscribeNext:^(id _Nullable x) {
NSLog(@"length = %@",x);
}];
4.创建一些信号,来表示用户名和密码输入框中的输入内容是否有效,设置背景颜色:
// 2.创建一些信号,来表示用户名和密码输入框中的输入内容是否有效
RACSignal *validUserNameSignal = [self.userNameTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) { return @([self isValidUsername:value]); // 输出是一个用NSNumber封装的布尔值
}]; RACSignal *validPasseordSifnal = [self.passwordTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) { return @([self isValidPassword:value]);
}]; // 3.转换这些信号,从而能为输入框设置不同的背景颜色
[[validUserNameSignal map:^id _Nullable(id _Nullable value) { return [value boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}] subscribeNext:^(id _Nullable x) {
self.passwordTF.backgroundColor = x;
}]; [[validPasseordSifnal map:^id _Nullable(id _Nullable value) { return [value boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}] subscribeNext:^(id _Nullable x) {
self.passwordTF.backgroundColor = x;
}]; // 4.宏来更好的完成上面的事情
RAC(self.passwordTF, backgroundColor) = [validPasseordSifnal map:^id _Nullable(id _Nullable value) { return [value boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}]; RAC(self.userNameTF, backgroundColor) = [validUserNameSignal map:^id _Nullable(id _Nullable value) {
return [value boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}];
} - (BOOL)isValidUsername:(NSString *)username {
return username.length > ;
} - (BOOL)isValidPassword:(NSString *)password {
return password.length > ;
}
5.登录按钮的点击进入判断条件:
// 5.聚合信号 登录按钮只有当用户名和密码输入框的输入都有效时才工作
RACSignal *signUpActiveSignal = [RACSignal combineLatest:@[validUserNameSignal ,validPasseordSifnal] reduce:^id (NSNumber *userNameValid, NSNumber *passwordValid) { return @([userNameValid boolValue] && [passwordValid boolValue]);
}];
[signUpActiveSignal subscribeNext:^(id _Nullable x) { self.logInButton.enabled = [x boolValue];
}];
6.登录按钮触发:
[[self.logInButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"button Click---");
}];
[[[self.logInButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
flattenMap:^id(id x){
return[self logginSignal];
}]
subscribeNext:^(NSNumber*signedIn){
BOOL success =[signedIn boolValue];
if(success){
NSLog(@"成功登录");
ViewController1 *vc1 = [[ViewController1 alloc]init];
[self.navigationController pushViewController:vc1 animated:YES];
}
}];
学了一些基础,慢慢学习吧!!! 需要源码的可以Q我哟!! 1299625033..哈哈
参考博文链接: http://www.cocoachina.com/ios/20150123/10994.html
ReactiveCocoa框架学习<一>的更多相关文章
- ReactiveCocoa框架学习1
写block直接使用inline block的声明类型 在ARC中使用strong,如果不使用strong,则会被销毁 在非ARC中使用copy block在开发中的使用场景 把block保存到对象中 ...
- ReactiveCocoa框架学习2
昨天内容回顾 信号类:表示有数据产生,信号类不发送数据 注意:不同的信号,订阅方式不同 RACSignal 创建RACDynamicSignal信号 -> didSubscribe(block) ...
- ReactiveCocoa 入门学习 (一)
引言 现在由于需求的不断发展,MVC这个经典的框架由于Controller的任务越来越多,显得"臃肿"了,网上又推出了新的框架,比如MVVM,ReactiveCocoa, 今天就来 ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- Hadoop学习笔记—18.Sqoop框架学习
一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...
- Spring框架学习一
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
- EF框架学习手记
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
- web框架学习列表
转载自鲁塔弗的博客,原文网址:http://lutaf.com/148.htm web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的 ...
- 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理
Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...
随机推荐
- mysql数据库常规命令操作
1.MySQL数据库导出命令 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcn ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 安装Office 2010后出现正在配置
OFFICE 2010 MSDN版出来后,下载安装 ,启动后发现每次打开都会出现“正在配置”的进度,删除重装亦不成功,对SETUP.EXE改名也不行,最后找到这个方法,成功,备忘: 运行以下内容: r ...
- review again and again
盲评结果出来了.然而对于我并没有太大的影响.从头到尾我没有紧张过,自然也不会有如释重负的感觉. 昨天说了事情要提前做准备.早上,到教研室挺早,review的时候,发现论文中一个关于目录的小问题,解决掉 ...
- python中logging
1.root logger以及logger斧子关系 http://www.pythonclub.org/modules/logging #coding=utf-8 __author__ = 'n ...
- 使用 jquery 获取当前时间的方法
我们在写一些效果时,经常要用到 jquery 获取当前时间,但是jquery 目前并没有提供直接获取当前时间的 api 或者函数,所以我们还是得用原生的 javascript 时间对象 Date 来获 ...
- LVS+keepalived负载均衡实战
1 首先安装虚拟机 安装系统 这里 配置两台虚拟机 1:192.168.137.102 2:192.168.137.103 分别安装tomcat 默认80端口,同时都是开启状态 配置192.168 ...
- centos 7 挂载大硬盘
对硬盘sdb进行分区 parted -a optimal /dev/sdb 使用GPT格式 mklabel gpt 建立一个主分区 mkpart primary - 显示分区信息 print 退出 q ...
- OpenGL ES 中的模板测试
模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1.glClear( GL_STE ...
- log4j输出日志到不同文件
1.先看log4j的配置文件 log4j.properties 没有此文件就在根目录下创建一个: log4j.rootLogger=INFO,R,Client log4j.appender.R=org ...