记录一下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 ...
随机推荐
- 分享一款架子鼓游戏【drum】
视频演示: 电脑版和安卓版都有,没有ios版. 适合想练架子鼓,但是还没买架子鼓的朋友.可以先当做游戏来练练节奏感...下载如下: 电脑版下载>> 手机安卓版下载>>
- Django-ORM外键属性总结
ForeignKey ForeignKey(ForeignObject) # ForeignObject(RelatedField) to, # 要进行关联的表名 to_field=None, # 要 ...
- Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance)
Leetcode之动态规划(DP)专题-72. 编辑距离(Edit Distance) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可 ...
- 华为HCNA乱学Round 7:VLAN间路由
- 访问https接口报错 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系
详细错误信息如下 请求错误信息:发生一个或多个错误.System.Net.Http.HttpRequestException: An error occurred while sending the ...
- Swool的安装与使用
1.swoole的安装 //php最好用7.2以上的.直接去网站下载下来,然后与php一样编译安装. git下来后,因为没有config文件,故先在swool下载目录下执行: /.../php/bin ...
- VBnet窗口获取键盘输入
https://blog.csdn.net/youyoulg/article/details/39120669 C# WinFrom捕获按键按下事件(一) https://blog.csdn.net/ ...
- jump用户管理命令
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa手动拷贝id_rsa.pub的内容到其他机器 或者用 ssh-copy,但你得知道对方root密码 ssh-copy-i ...
- PTA(Basic Level)1006.Sign In and Sign Out
At the beginning of every day, the first person who signs in the computer room will unlock the door, ...
- 如何重装mysql8及初次修改密码
首先在设置里卸载旧版的mysql 然后把你之前的安装的mysql文件夹整个删掉 然后删除注册表的MySQL信息 安装新版的MySQL 新建并配置my-default.ini文件 如下: [mysqld ...