ReactiveCocoa - study
//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的更多相关文章
- iOS开发之ReactiveCocoa下的MVVM(干货分享)
最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...
- 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 ...
- [iOS]ReactiveCocoa安装方法
1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...
- 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 ...
- ReactiveCocoa源码拆分解析(七)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...
- ReactiveCocoa源码拆分解析(六)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...
- ReactiveCocoa源码拆分解析(五)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...
随机推荐
- LODOP、C-Lodop简短排查语句
https使用,故障:1.是https网站吗,https扩展版C-Lodop如何使用 参考http://www.c-lodop.com/faq/pp32.html2.双击桌面上的c-lodop快捷方式 ...
- P1137 旅行计划
/*拓扑排序去寻找点的拓扑序 便于DP,那么怎么去找 首先邻接表存边,然后dfs搜寻每一个点 最后进行拓扑排序,找到拓扑序*/ #include<bits/stdc++.h> ; ; us ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- IDEA的 mybatis插件报错 - IDE Fatal Errors
IDE Fatal Errors Exception in plugin Mybatis plugin. A minute ago. Occurred once since the last clea ...
- codeforces 1077F2. Pictures with Kittens (hard version)单调队列+dp
被队友催着上(xun)分(lian),div3挑战一场蓝,大号给基佬紫了,结果从D开始他开始疯狂教我做人??表演如何AKdiv3???? 比赛场上:A 2 分钟,B题蜜汁乱计数,结果想得绕进去了20多 ...
- 为什么要写 tf.Graph().as_default()
首先,去tensorflow官网API上查询 tf.Graph() 会看到如下图所示的内容: 总体含义是说: tf.Graph() 表示实例化了一个类,一个用于 tensorflow 计算和表示用的数 ...
- nginx服务器的基本配置
nginx作为反向代理搭建服务器的优点. 处理响应请求很快:单次请求会得到更快的响应.在高峰期,Nginx 可以比其它的 Web 服务器更快的响应请求 高并发连接:理论上,Nginx 支持的并发连接上 ...
- Zabbix通过JMX方式监控java中间件
Zabbix2.0添加了支持用于监控JMX应用程序的服务进程,称为“Zabbix-Java-gateway”:它是用java写的一个程序. 工作原理: zabbix_server想知道一台主机上的特定 ...
- python实现加密
1.md5加密 hashlib 库中包括如SHA1.SHA224.SHA256.SHA384.SHA512和MD5算法等 >>> import hashlib>>> ...
- 四大解析器(BeautifulSoup、PyQuery、lxml、正则)性能比较
用标题中的四种方式解析网页,比较其解析速度.当然比较结果数值与电脑配置,python版本都有关系,但总体差别不会很大. 下面是我的结果,lxml xpath最快,bs4最慢 ==== Python v ...