记录一下RAC的使用
1 常规的对数组的操作,包括遍历、刷选、映射、替换
// 遍历
NSArray * array = @[@"",@"",@"",@"",@"",@""];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"数组内容:%@", x);
}]; 注释:可遍历所有元素,但因为内部实现是异步执行的(for in是在当前线程),所以使用时候需要注意时间顺序。 // 刷选
NSArray *filter = [[array.rac_sequence filter:^BOOL(id value) {
return [value integerValue] > ;
}] array];
NSLog(@"filter:%@",filter); // (3,4,5,6) // 映射
NSArray *map = [[array.rac_sequence map:^id(id value) {
NSInteger a = [value integerValue] * [value integerValue];
return [NSString stringWithFormat:@"%ld", a];
}] array];
NSLog(@"map:%@",map); //(1,4,9,16,25,36)
// 数组替换所有元素
NSArray * array1 = @[@"1",@"2",@"3",@"4",@"5",@"6"];
NSArray * newArray = [[array1.rac_sequence mapReplace:@"99"] array];
NSLog(@"%@",newArray);
2 节流 throttle
表示 指定时间间隔内,不再发送信号 这里添加 throttle, 表示在 1 秒内 text 没有改变时,才会进行搜索请求
UITextField *textfield;
[[[textfield rac_textSignal]
throttle:]
subscribeNext:^(id x) {
NSLog(@"开始搜索请求==%@", x);
}];
3 事件处理 KVO监听 通知等
UITextField * textF;
//实时监听输入框中文字的变化
[[textF rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框的内容--%@",x);
}]; //UITextField的UIControlEventEditingChanged事件,免去了KVO
[[textF rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
//添加监听条件
[[textF.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return [value isEqualToString:@""];//此处为判断条件,当输入的字符为100的时候执行下面方法
}]subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框的内容为%@",x);
}]; UIButton *loginBtn;
//监听点击事件
[[loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);//x为一个button对象,别看类型为UIControl,继承关系UIButton-->UIControl-->UIView-->UIResponder-->NSObject
x.frame = CGRectMake(, , , );
}];
//KVO监听按钮frame的改变
[[loginBtn rac_valuesAndChangesForKeyPath:@"frame" options:(NSKeyValueObservingOptionNew) observer:self] subscribeNext:^(RACTwoTuple<id,NSDictionary *> * _Nullable x) {
NSLog(@"frame改变了%@",x);
}]; //定时器
[[RACSignal interval:2.0 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(NSDate * _Nullable x) {
NSLog(@"你好哇。");
//这里面的方法2秒一循环
}]; //通知。。。不需要注销了
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@ 键盘弹起", x); // x 是通知对象
}];
4 反向传值,也可以使用block 代理 通知,但是使用RAC最简单
在controller中
SubView *subView = [[SubView alloc] initWithFrame:CGRectMake(, , , )];
subView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:subView]; [[subView rac_signalForSelector:@selector(sendValues:data:)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"===111%@",x);
}];
在SubView.h中声明这个方法
- (void)sendValues:(NSString *)type data:(NSDictionary *)dicc;
在SubView.m中调用这个方法
- (void)btnAction:(UIButton *)sender
{
[self sendValues:@"" data:@{@"key" : @"values"}];
}
5 RACSubject使用
// 创建信号
RACSubject *subject = [[RACSubject alloc] init]; // 订阅信号
[subject subscribeNext:^(id _Nullable x) {
NSLog(@"==%@",x);
}];
// 发送信号
[subject sendNext:@"今天天气还是一如既往的好,希望明天也是如此"];
6 关于多请求的处理,其实可以使用GCD等方式,但是这里使用RAC还是比较方便的
- (void)demo7
{
RACSignal *single1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 1:请求数据
// 2:发送数据
[subscriber sendNext:@"single1"];
return nil;
}]; RACSignal *single2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 1:请求数据
// 2:发送数据
[subscriber sendNext:@"single2"];
return nil;
}]; // 订阅信号
[single1 subscribeNext:^(id _Nullable x) {
NSLog(@"------处理1..%@",x);
}]; [single2 subscribeNext:^(id _Nullable x) {
NSLog(@"------处理2。。%@",x);
}]; // 当数组中所有信号都发送了数据,才会执行selector,必须带参,参数是sendNext发送过来的,必须和信号一一对应
// 参数:每个信号发送的数据,这里必须要带参数,不然会崩溃
[self rac_liftSelector:@selector(updateUIOneData:TwoData:) withSignalsFromArray:@[single1,single2]];
} - (void)updateUIOneData:(id)x1 TwoData:(id)x2
{
NSLog(@"更新UI:%@----%@",x1,x2);
}
7. 使用宏
UILabel *myLabel;
// 监测某个对象的属性,发生变化时回直接回调给block
[RACObserve(myLabel, text) subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}]; // RAC:把一个对象的某个属性绑定一个信号,只要发出信号,就会把信号的内容给对象的属性赋值
// 给label的text属性绑定了文本框改变的信号
UITextField *textfield;
RAC(myLabel, text) = textfield.rac_textSignal;
[textfield.rac_textSignal subscribeNext:^(id x) {
myLabel.text = x;
}];
举一个监听的例子。
需求就是监听scrollerview 的滑动。当滑动的时候就输出日志。如下:
UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(, , , )];
scrolView.contentSize = CGSizeMake(, );
scrolView.backgroundColor = [UIColor greenColor];
[self.view addSubview:scrolView];
[RACObserve(scrolView, contentOffset) subscribeNext:^(id x) {
NSLog(@"success");
}];
8. 补一下merge 和 combineLatest 的用法。
先看代码吧:
RACSubject *aaaaa = [RACSubject subject];
RACSubject *bbbbb = [RACSubject subject];
[[RACSignal merge:@[aaaaa,bbbbb]]subscribeNext:^(id x) {
NSLog(@"信号发送combineLatest:%@",x);
}]; [aaaaa sendNext:@""];
[bbbbb sendNext:@""];
和
RACSubject *aaaaa = [RACSubject subject];
RACSubject *bbbbb = [RACSubject subject];
[[RACSignal combineLatest:@[aaaaa,bbbbb]]subscribeNext:^(id x) {
NSLog(@"信号发送combineLatest:%@",x);
}]; [aaaaa sendNext:@""];
[bbbbb sendNext:@""];
这两个非常相似,merge指的是只要发送一个信号,block就会回掉,然后回调回来的是那个改变你的singal的值
而combineLatest也是只要发送一个信号,block就会回调,然后把所有信号的值以元祖的形式返回来
参考文章: https://www.jianshu.com/p/666bc733559a
记录一下RAC的使用的更多相关文章
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- Oracle 10g RAC中的DRM问题及关闭
在RAC环境中,Oracle使用GRD(Global Resource Service)来记录各个RAC节点的资源信息,具体通过GCS(Global Cache Service)和GES(Global ...
- 【RAC】RAC相关基础知识
[RAC]RAC相关基础知识 1.CRS简介 从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...
- 转载:【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- 【转】【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
原文地址:http://www.cnblogs.com/baiboy/p/orc3.html 阅读目录 目录 RAC 工作原理和相关组件 ClusterWare 架构 RAC 软件结构 集群注册(OC ...
- HP-UX 11g RAC安装 记录
环境:HP-UX 11.31 + GI 11.2.0.4 + Oracle 11.2.0.4 背景:本文只对HP-UX平台安装11g RAC环境过程中,针对一些跟Linux平台有差异的地方进行简单记录 ...
- Oracle RAC运维所遇问题记录一
Oracle11gR2,版本11.2.0.4集群测试环境运行正常 主机名:rac1,rac2 hosts文件: # Public172.17.188.12 rac1172.17.188.13 rac2 ...
- 【Oracle RAC】Linux系统Oracle18c RAC安装配置详细记录过程(图文并茂)
本文Oracle 18c GI/RAC on Oracle Linux step-by-step 的安装配置步骤,同时也包含dbca 创建数据库的过程. 1. 关闭SELINUX,防火墙vi /etc ...
- Oracle RAC运维所遇问题记录二
oracle12c RAC源端与Dataguard目标端实时同步,因业务需求需要在源端增加PDB 1. 源端添加PDB CREATE PLUGGABLE DATABASE kdlxpdb admin ...
随机推荐
- Day04:集合框架(下) / 集合操作——线性表(一)
对象转型 向上转型: 什么是向上造型? 子类对象赋给父类引用 父类引用指向子类对象 父类类型 引用=子类对象; 子类转成父类 默认进行(父类引用指用子类对象). 为什么需要向上造型? 子类对象可 ...
- 转-Uptime与数据中心等级认证
1 数据中心等级认证 随着数据中心的蓬勃发展,越来越多的标准被制定出具.其中,Uptime Tier认证在业内是认同度最高的标准.以前,Uptime在中国的宣传很少,很多人对Uptime及其认证体系不 ...
- Interceptors - 拦截器
1.概述 Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的. 拦截器需要实现org.apache.flume.interceptor.Intercep ...
- Reactor系列(十二)window嵌套
#java#reactor#flux#window# Flux嵌套 视频解说: https://www.bilibili.com/video/av80458406/ FluxMonoTestCase. ...
- javase-整数变量的交换
public class Operator { public static void main(String[] args) { int a=10; int b=20; System.out.prin ...
- 在Docker中部署ASP.NET Core 2.2
⒈新建一个ASP.NET Core2.2 Web程序 因为Windows的Docker和Linux的Docker有所不同,本次测试采用的是Linux的Docker,因此没有勾选启用Docker支持. ...
- HTML(上)
目录 HTML(上) 浏览器 HTML 什么是HTML HTML的作用 编写HTML的规范 HTML结构 HTML常用标签 HTML标签速记 HTML(上) 浏览器 浏览器也是一个客户端 #这是一个服 ...
- leecode刷题(29)-- 二叉树的中序遍历
leecode刷题(29)-- 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路 跟 ...
- 稀疏矩阵三元组快速转置(转poklau123写的很清楚)
关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j ...
- php运行结果设置无缓存
修改配置php.ini vim /usr/local/php/lib/php.ini opcache.enable= 重启php服务 service php-fpm restart done! 参考地 ...