//KVO值监控,当alertTip改变时调用, filter对alertTip值进行过滤,此处当alertTip存在而长度不为0时,执行suscribeNext方法,弹出提示
[[RACObserve(self, alertTip) filter:^BOOL(NSString * value) {
return value.length != 0 && value;
}] subscribeNext:^(NSString * tip) { Alert(tip);
}];

  

 

   RAC(self.loginViewModel, userName) = self.userNameTF.rac_textSignal;
// 作用: 将一个对象(self.loginViewModel) 的一个属性(userName) 和一个信号signal(rac_textSignal)绑定,当信号有变化的时候,绑定的值也对应变化
RAC(self.loginViewModel, password) = self.passwordTF.rac_textSignal; @weakify(self) //避免block造成的循环引用 ,给一个按钮(loginButton) 添加事件(点击事件), [[self.loginButton rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x) { @strongify(self) if (self.loginViewModel.userName.length == 0) { self.loginViewModel.alertTip = @"用户名不能为空"; return ; } if (self.loginViewModel.password.length == 0) { self.loginViewModel.alertTip = @"密码不能为空"; return; } [self.loginViewModel clickLogin]; }];

[[[self.textField1.rac_textSignal startWith:@"输入框长度必须大于3" ] filter:^BOOL(NSString * tf) {
return tf.length > 3;
}] subscribeNext:^(NSString * tf) {
NSLog(@"%@",tf);
}]; //
//startWith 说明作用 

  

   [[[self.textField1.rac_textSignal ignore: @"1"] startWith: @"忽略给定的值" ]subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//ignore 忽略给定的值

 

RAC(self.showLabel, text) = [RACObserve(self, name) distinctUntilChanged];

    [RACObserve(self.showLabel, text) subscribeNext:^(id x) {
NSLog(@"%@",x);
}]; self.name = @"Bob";
self.name= @"Bob";
self.name= @"Bob2";
//distinctUntilChanged 当和上一次值相同时会忽略 (例如修改用户名的时候,向网络提交时,如果和上一次相同就不必要执行操作)

  

[[self.textField1.rac_textSignal takeUntilBlock:^BOOL(NSString * tf) {
return [tf isEqualToString: @"stop"];
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//当给定的signal完成前一直取值 (当输入框的值==stop前一直取值)

  

 [[self.textField1.rac_textSignal take: 4] subscribeNext:^(id x) {
QLog(@"%@",x);
}];
//take 只会取前几次的值

  

_subject = [RACSubject subject];
[_subject subscribeNext:^(id x) {
NSLog(@"%@",x);
}]; [[_button2 rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x) {
[_subject sendNext:@"点击按钮"];
}];
//RACSubject可充当信号也可以发送信号,通常用它来替代代理

 

RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

        NSLog(@"执行命令");

//        return [RACSignal empty]; // 如果是空信号则返回

        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

            [subscriber sendNext: @"请求数据"];

            [HttpRequestManager request_login: dic block:^(NSInteger code, NSString *msg, id content) {

                if (code == 200) { //请求成功

                    [subscriber sendNext: content];

                    [subscriber sendCompleted];//完成

                }

                else { //请求失败

                    [subscriber sendError: nil];

                }

            }];

            return nil;

        }];

    }];

    self.command = command; //强引用命令,不要被销毁,否则接收不到数据

    //订阅RACCommand中的信号

    //    [[_button2 rac_signalForControlEvents: UIControlEventTouchUpInside] executeCommand: command];

//绑定按钮事件
[[_button2 rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x) { [command execute: nil]; }]; [command.executionSignals subscribeNext:^(id x) { NSLog(@"%@",x); [x subscribeNext:^(id x) { NSLog(@"%@",x); }]; }];
//发出的最新信号,和上面代码效果相同(方式2)

[command.executionSignals.switchToLatest subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

// 和上面效果相同(方式3) 

//flattenMap作用:把源信号的内容映射成一个新的信号,信号可以是任意类型

[command.executionSignals.switchToLatest flattenMap:^RACStream *(id value) {

return  [RACStream return: command];

}];

  [command.errors subscribeNext:^(NSError * error) {

      NSLog(@"%@",error);

  }];

  

//map 映射, skip 跳过前几次
[[[self.textField1.rac_textSignal map:^id(NSString * str) {
return [NSString stringWithFormat:@"ABC-%@",str];
}]
skip: 2]
subscribeNext:^(NSString * str) {
NSLog(@"%@",str);
}];

  

//每隔1秒执行,类型定时器
[[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];

  

 

  

ReactiveCocoa - study的更多相关文章

  1. iOS开发之ReactiveCocoa下的MVVM(干货分享)

    最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...

  2. ReactiveCocoa 冷热订阅(cold subscribe, hot subscribe)

    ReactiveCocoa支持两种订阅方式,一种是冷订阅,一种是热订阅. 热订阅的特点: 1.不管有没有消息订阅着,发送者总会把消息发出去. 2.不管订阅者是什么时候订阅的,发送者总是会把相同的消息发 ...

  3. 为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject

    原文解释在这里http://cocoadocs.org/docsets/ReactiveCocoa/0.6.0/ 在标题Creating hot subscribables 底下 先贴原文: The ...

  4. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...

  5. [iOS]ReactiveCocoa安装方法

    1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...

  6. Improve Your Study Habits

    1.Plan your time carefully. Make a list of your weekly tasks.Then make a schedule or chart of your t ...

  7. ReactiveCocoa源码拆分解析(七)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...

  8. ReactiveCocoa源码拆分解析(六)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...

  9. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

随机推荐

  1. Feature Pyramid Networks for Object Detection比较FPN、UNet、Conv-Deconv

    https://vitalab.github.io/deep-learning/2017/04/04/feature-pyramid-network.html Feature Pyramid Netw ...

  2. Announcing the public preview of Azure Dev Spaces

    Today, we are excited to announce the public preview of Azure Dev Spaces, a cloud-native development ...

  3. [BZOJ 3992] [SDOI 2015] 序列统计

    Description 传送门 Solution [一] 设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(j\) 的方案数,有 \[ f[i][j]=\su ...

  4. 【XSY3156】简单计数II 容斥 DP

    题目大意 定义一个序列的权值为:把所有相邻的相同的数合并为一个集合后,所有集合的大小的乘积. 特别的,第一个数和最后一个数是相邻的. 现在你有 \(n\) 种数,第 \(i\) 种有 \(c_i\) ...

  5. <数据结构基础学习>(三)Part 1 栈

    一.栈 Stack 栈也是一种线性的数据结构 相比数组,栈相对应的操作是数组的子集. 只能从一端添加元素,也只能从一端取出元素.这一端成为栈顶. 1,2,3依次入栈得到的顺序为 3,2,1,栈顶为3, ...

  6. [M$]微软提供的ProcessExplorer等系统工具集合

    https://docs.microsoft.com/en-us/sysinternals/downloads/index

  7. CentOS配置history记录每个用户执行过的命令

    一个偶然的机会,看到了这个文档,先存下来,后续使用的话直接就加进去了 要记录登录者的用户名.IP.操作记录,在/etc/bashrc末尾加入几个环境变量,用于history命令显示用户ip等内容,完成 ...

  8. Burnside引理的感性证明

    \(Burnside\)引理的感性证明: 其中:\(G\)是置换集合,\(|G|\)是置换种数,\(T_i\)是第\(i\)类置换中的不动点数. \[L = \frac{1}{|G|} * \sum ...

  9. https://www.chromestatus.com/features/5093566007214080

    移动端滑动报错:Unable to preventDefault inside passive event listener due to target being treated as passiv ...

  10. DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制

    前言 深度/模板测试使用的是与后备缓冲区同等分辨率大小的缓冲区,每个元素的一部分连续位用于深度测试,其余的则用作模板测试.两个测试的目的都是为了能够根据深度/模板状态需求的设置来选择需要绘制的像素. ...