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. 【WPF】非UI线程操作UI

    在线程中添加下面两行,把操作UI的命令放到一个新函数中 Action 起个名 = new Action(操作UI的函数名);要操作的控件名.Dispatcher.BeginInvoke(起个名);

  2. 04 npm 命令大全

    一.npm简介   npm(Node Package Manager)是随同node.js 一起安装的包管理工具,为了解决nodejs代码部署上的很多问题,常用以下场景: 允许用户从npm服务器下载别 ...

  3. Django的一些注意事项

    不要使用 Python 或 Django 的组件名命名项目.具体而言,不要使用“django”(与 Django 冲 突)或“test”(与 Python 内置的一个包冲突)这样的名称. 在中文版中, ...

  4. property自己实现

    # 先回顾一下 class Room: def __init__(self,name,width,length): self.name = name self.width = width self.l ...

  5. 【Linux开发】linux设备驱动归纳总结(九):1.platform总线的设备和驱动

    linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  6. PLSQL中查到的数据和程序中查询到的不一样

    1.首先看下你的修改或者新增的SQL是否提交.

  7. Go语言中的map(十一)

    map是一种无序的基于 key-value 的数据结构,Go语言中的map是引用类型,所以跟切片一样需要初始化才能使用. 定义map 定义 map 的语法如下: map[keyType]ValueTy ...

  8. 区间最值的优秀数据结构---ST表

    ST表,听起来高大上,实际上限制非常多,仅仅可以求最值问题: 为什么?先从原理看起: st表运用了倍增的思想:st[i][j] = min(st[i][j - 1],st[i + 2^(j - 1)) ...

  9. 字符串转数组(php版)

    思路: 1.判断当前传来的值是否为数组 2.若不是现将传来的值转换为字符串类型 3.判断当前值是否为空 4.若不为空,采用正则进行匹配,如下图 preg_match('/^{.*?}$/', $str ...

  10. Django之自定义标签,过滤器,以及inclusion_tag

    目录 Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 自定义标签 inclusion_tag inclusion_tag() 项目实例: inclusion_tag() ...