@interface ViewController ()

@property (weak, nonatomic) IBOutlet lwRedView *redView;
@property (weak, nonatomic) IBOutlet UIButton *lwbtn; @property (weak, nonatomic) IBOutlet UITextField *phoneTF;
@property (weak, nonatomic) IBOutlet UITextField *pwTF;
@property (weak, nonatomic) IBOutlet UIButton *loginBtn; @property (nonatomic, strong) RACCommand * loginCommand; @end @implementation ViewController - (void)tryUseRACMethod
{
// map 可以转换 信号 (文本输入的字符串 转化为 是否长度为3的bool值)
// 验证输入框的合法性
RACSignal *phoneValidSignal = [self.phoneTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
return @((value.length == ));
}];
RACSignal *pwValidSignal = [self.pwTF.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
return @(value.length>&&value.length <= );
}]; // 根据监听输入框的内容,是否合法,来改变输入框的背景色
[[phoneValidSignal map:^id _Nullable(id _Nullable value) {
return [value boolValue] ? UIColor.clearColor : UIColor.yellowColor;
}] subscribeNext:^(id _Nullable x) {
self.phoneTF.backgroundColor = x;
}]; // RAC(_phoneTF,backgroundColor) = [phoneValidSignal map:^id _Nullable(id _Nullable value) {
// return value ? UIColor.clearColor : UIColor.yellowColor;
// }];
RAC(_pwTF,backgroundColor) = [pwValidSignal map:^id _Nullable(id _Nullable value) {
return [value boolValue] ? UIColor.clearColor : UIColor.yellowColor;
}]; // 合并信号(手机号,密码输入框),创建一个新的关于按钮状态的信号,改变按钮的状态
RACSignal *activeBtnSignal = [RACSignal combineLatest:@[phoneValidSignal,pwValidSignal] reduce:^id _Nullable(NSNumber *ph,NSNumber *pw){
return @([ph boolValue] && [pw boolValue]);
}];
// 把按钮 和信号绑定
[activeBtnSignal subscribeNext:^(id _Nullable x) {
self.loginBtn.backgroundColor = [x boolValue] ? UIColor.redColor : UIColor.grayColor;
}]; /// 创建一个登陆请求的信号
RACSignal *loginSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[self loginRequestWithPhone:self.phoneTF.text pw:self.pwTF.text callBlock:^(BOOL res) {
[subscriber sendNext:@(res)];
[subscriber sendCompleted];
}];
return nil;
}]; [[[[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
doNext:^(id _Nullable x) {
// 边际效应 不改变信号本身
self.loginBtn.enabled = NO;
}]
// flattenMap 返回信号内容
flattenMap:^__kindof RACSignal * _Nullable(__kindof UIControl * _Nullable value) {
return loginSignal;
}]
subscribeNext:^(id _Nullable x) {
NSLog(@"----------%@",x);
self.loginBtn.enabled = YES;
}]; [self.loginCommand.executionSignals.switchToLatest subscribeNext:^(id _Nullable x) {
NSLog(@"--------logincommand:%@",x);
}]; [[self.loginCommand executionSignals] subscribeNext:^(id _Nullable x) {
NSLog(@"--------1:%@",x);
// 开始网络请求的信号
self.view.backgroundColor = [UIColor redColor];
[x subscribeNext:^(id _Nullable x) {
// 网络请求的回调信号
NSLog(@"--------2:%@",x);
self.view.backgroundColor = [UIColor whiteColor];
}];
}]; [[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
subscribeNext:^(__kindof UIControl * _Nullable x) {
// 开始执行command
[self.loginCommand execute:nil];
}];
} // 模拟网络请求
- (void)loginRequestWithPhone:(NSString *)phone pw:(NSString *)pw callBlock:(callBlock)callBlock
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if ([phone isEqualToString:@""] && [pw isEqualToString:@""]) {
if(callBlock) callBlock(YES);
}else{
if(callBlock) callBlock(NO);
}
});
} - (RACCommand*)loginCommand
{
if (!_loginCommand) { _loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSString *phone = @"";
NSString *pw = @"";
/// 网络请求
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if ([phone isEqualToString:@""] && [pw isEqualToString:@""]) {
[subscriber sendNext:@()];
}else{
[subscriber sendNext:@()];
}
[subscriber sendCompleted];
});
return nil;
}];
}];
}
return _loginCommand;
} - (void)testRACMethod
{
/** 监听方法 */
[[self.redView rac_signalForSelector:@selector(clickBtn:)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"========%@",x);
}]; /// 事件的响应
[[self.lwbtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"------%@",x);
}]; /** 监听 kvo */
[[self.redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id x) {
NSLog(@"---------%@",x);
}];
// 宏定义的KVO
[RACObserve(self.redView, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"---------%@",x);
}]; /** 监听 通知 */
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"rac_noti_key" object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"-------------%@",x);
}]; // 监听输入框
[self.wltf.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
NSLog(@"------tf:%@",x);
}]; // 为输入框添加 filter 过滤器
[[self.wltf.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length < ;
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"-------filter_text:%@",x);
}]; [[[self.wltf.rac_textSignal map:^id _Nullable(NSString * _Nullable value) {
// 转换信号流为 字符串长度信号流
return @(value.length);
}] filter:^BOOL(NSNumber* _Nullable value) {
return [value integerValue] > ;
}] subscribeNext:^(id _Nullable x) {
NSLog(@"==============%ld",[x integerValue]);
}]; /// 手势的使用
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[tap.rac_gestureSignal subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
NSLog(@"-------%@",x);
}];
[self.view addGestureRecognizer:tap];
} - (void)viewDidLoad {
[super viewDidLoad]; [self tryUseRACMethod];
} -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
_redView.frame = CGRectMake(, , , );
} @end

RAC基本使用的更多相关文章

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  2. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  3. 利用XAG在RAC环境下实现GoldenGate自动Failover

    概述 在RAC环境下配置OGG,要想实现RAC节点故障时,OGG能自动的failover到正常节点,要保证两点: 1. OGG的checkpoint,trail,BR文件放置在共享的集群文件系统上,R ...

  4. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)

    集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...

  5. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  6. 使用SwingBench 对Oracle RAC DB性能 压力测试

    我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...

  7. Openfiler配置RAC共享存储

    将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...

  8. ReactiveCocoa代码实践之-UI组件的RAC信号操作

    上一节是自己对网络层的一些重构,本节是自己一些代码小实践做出的一些demo程序,基本涵盖大多数UI控件操作. 一.用UISlider实现调色板 假设我们现在做一个demo,上面有一个View用来展示颜 ...

  9. Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

    ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  10. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

随机推荐

  1. PAT1060【大模拟啊】

    怎么麻烦怎么来了??? 提供几个案例: 5 0.00001 0.00001 0 0.0 0.0222 1 0.001 0.2000 2 005.06 0.230 1 00.020 0 贴份代码跑.. ...

  2. 再回首HTML

    前言 本阶段视频自己前后看了两遍,感觉效果还是不错的,鉴于昨天上午整理了一些笔记,对HTML的理解深刻了一些.所以在这篇博文中就不再解释关于HTML一些定义的东西,这篇博文主要记录一些常用标记,为以后 ...

  3. cf834D(dp+线段树区间最值,区间更新)

    题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...

  4. JavaWeb:Cookie处理和Session跟踪

    JavaWeb:Cookie处理和Session跟踪 Cookie处理 什么是Cookie Cookie 是存储在客户端计算机上的文本文件,保留了各种跟踪信息.因为HTTP协议是无状态的,即服务器不知 ...

  5. Jmeter中JDBC Request和BeanShell PostProcessor的结合使用(SQL模糊查询)

    [前言] 今天记录一下Jmeter中JDBC Request和BeanShell PostProcessor的结合使用的方法(SQL模糊查询) [步骤] 1.下载对应数据库的驱动包到jmeter安装目 ...

  6. Hadoop中解除 "Name node is in safe mode"的方法

    运行hadoop程序时,有时候会报以下错误,说明Hadoop的NameNode处在安全模式下. 原因分析: 在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文 ...

  7. luoguP4931 情侣?给我烧了!(加强版)

    luogu 普通版题解:https://www.cnblogs.com/lcxer/p/10876856.html 在普通版里,我们考虑对于\(n\)对情侣,恰好\(k\)对是和谐的方案数是 \[ a ...

  8. Polycarp's Pockets(思维)

    Polycarp has nn coins, the value of the ii-th coin is aiai. Polycarp wants to distribute all the coi ...

  9. weblogic.xml

    <?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="ht ...

  10. MYSQL性能优化之Mysql数据库监控

    监控对象 数据库可用性监控数据库进程或是端口存在并不意味着数据库就是可用的 也就是说登陆服务器,并且能正确执行mysql命令 数据库性能 QPS和DPS并发线程数量(同时执行sql语句的数量,不是连接 ...