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的使用的更多相关文章

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

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

  2. Oracle 10g RAC中的DRM问题及关闭

    在RAC环境中,Oracle使用GRD(Global Resource Service)来记录各个RAC节点的资源信息,具体通过GCS(Global Cache Service)和GES(Global ...

  3. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  4. 转载:【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

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

    原文地址:http://www.cnblogs.com/baiboy/p/orc3.html 阅读目录 目录 RAC 工作原理和相关组件 ClusterWare 架构 RAC 软件结构 集群注册(OC ...

  6. HP-UX 11g RAC安装 记录

    环境:HP-UX 11.31 + GI 11.2.0.4 + Oracle 11.2.0.4 背景:本文只对HP-UX平台安装11g RAC环境过程中,针对一些跟Linux平台有差异的地方进行简单记录 ...

  7. Oracle RAC运维所遇问题记录一

    Oracle11gR2,版本11.2.0.4集群测试环境运行正常 主机名:rac1,rac2 hosts文件: # Public172.17.188.12 rac1172.17.188.13 rac2 ...

  8. 【Oracle RAC】Linux系统Oracle18c RAC安装配置详细记录过程(图文并茂)

    本文Oracle 18c GI/RAC on Oracle Linux step-by-step 的安装配置步骤,同时也包含dbca 创建数据库的过程. 1. 关闭SELINUX,防火墙vi /etc ...

  9. Oracle RAC运维所遇问题记录二

    oracle12c RAC源端与Dataguard目标端实时同步,因业务需求需要在源端增加PDB 1. 源端添加PDB CREATE PLUGGABLE DATABASE kdlxpdb admin ...

随机推荐

  1. Day04:集合框架(下) / 集合操作——线性表(一)

    对象转型 向上转型: 什么是向上造型? 子类对象赋给父类引用 父类引用指向子类对象 父类类型 引用=子类对象; 子类转成父类    默认进行(父类引用指用子类对象). 为什么需要向上造型? 子类对象可 ...

  2. 转-Uptime与数据中心等级认证

    1 数据中心等级认证 随着数据中心的蓬勃发展,越来越多的标准被制定出具.其中,Uptime Tier认证在业内是认同度最高的标准.以前,Uptime在中国的宣传很少,很多人对Uptime及其认证体系不 ...

  3. Interceptors - 拦截器

    1.概述 Flume有能力在运行阶段修改/删除Event,这是通过拦截器(Interceptors)来实现的. 拦截器需要实现org.apache.flume.interceptor.Intercep ...

  4. Reactor系列(十二)window嵌套

    #java#reactor#flux#window# Flux嵌套 视频解说: https://www.bilibili.com/video/av80458406/ FluxMonoTestCase. ...

  5. javase-整数变量的交换

    public class Operator { public static void main(String[] args) { int a=10; int b=20; System.out.prin ...

  6. 在Docker中部署ASP.NET Core 2.2

    ⒈新建一个ASP.NET Core2.2 Web程序 因为Windows的Docker和Linux的Docker有所不同,本次测试采用的是Linux的Docker,因此没有勾选启用Docker支持. ...

  7. HTML(上)

    目录 HTML(上) 浏览器 HTML 什么是HTML HTML的作用 编写HTML的规范 HTML结构 HTML常用标签 HTML标签速记 HTML(上) 浏览器 浏览器也是一个客户端 #这是一个服 ...

  8. leecode刷题(29)-- 二叉树的中序遍历

    leecode刷题(29)-- 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路 跟 ...

  9. 稀疏矩阵三元组快速转置(转poklau123写的很清楚)

    关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j ...

  10. php运行结果设置无缓存

    修改配置php.ini vim /usr/local/php/lib/php.ini opcache.enable= 重启php服务 service php-fpm restart done! 参考地 ...