(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载)

在这篇博客中,我将把ReactiveCocoa中的擦作符做具体的介绍,附上对应的应用场景,是持续更新的。如果有的场景不合适,或者有更好的使用场景,可以留言,我会改进的。

拼接

- (RACSignal *)concat:(RACSignal *)signal;

拼接两个信号,合成的信号,在self发送sendCompleted后,发送新signal的值。

实际案例:在RACSequence这里比较有用,其他场景一时没有想到。比如需要拼接两个数组,那么可以使用concat。

压缩

- (RACSignal *)zipWith:(RACSignal *)signal;

压缩两个信号,这个函数的命名很有意思,zip是拉链的意思,确实功能跟拉链比较相似,只有在两个信号都有值发送时,每次取各自信号的对应下标的值,就像拉链一样,如果要拉的话,必需保证都有接下来呢的链,且需要对应。

实际案例:页面中包含两部分,上面时banner,下面的列表数据,当两个数据源都没有数据时,那么在页面上显示一个没有数据的提示页面。那么可以将两个信号进行压缩

RACSignal *bannerSignal = RACObserve(self.viewModel, bannerList).distinctUntilChanged.replayLazily;

RACSignal *listSignal = RACObserve(self.viewModel, messageList).distinctUntilChanged.replayLazily;

然后zip一下,将zip返回的元组

RAC(self.noneDataTipView,hidden) = [[bannerSignal zipWith:listSignal] map:^id(id value) {

    return @(1);

}];

这么作不太好,甚至会出现一些错误,你需要保证刷新数据的次数一致(像拉链一样)才能正常工作。下面我会介绍这种场景的更好实现。

应用压缩

- (RACSignal *)reduceApply;

这个函数算是比较高级的操作符了,是将信号流进行合并操作的,高级的地方在于第一个信号传递来的是一个函数(block),而其他信号传递来的值,则传递到函数中去执行,最后返回一个结果。

实际案例:计算器。

    RACReplaySubject *operator = [RACReplaySubject subject];
RACReplaySubject *leftHandSideValue = [RACReplaySubject subject];
RACReplaySubject *rightHandSideValue = [RACReplaySubject subject]; [[[RACSignal combineLatest:@[operator,leftHandSideValue,rightHandSideValue]] reduceApply] subscribeNext:^(id x) {
NSLog(@"%@",x);
}]; [operator sendNext:^id(NSNumber *a,NSNumber *b){
return @(a.integerValue + b.integerValue);
}]; [leftHandSideValue sendNext:@(10)];
[rightHandSideValue sendNext:@(20)]; [operator sendNext:^id(NSNumber *a,NSNumber *b){
return @(a.integerValue - b.integerValue);
}];

可以看到,第一个信号是个操作符,然后操作符左边的值信号,操作符右边值信号。首先传递了一个加法操作符,传递了值。获得输出30,当用户点击了减号按钮时,可以传递一个减号操作符,也就是上面最后一个。

ReactiveCocoa源码拆分解析(七)的更多相关文章

  1. ReactiveCocoa源码拆分解析(一)

    (整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...

  2. ReactiveCocoa源码拆分解析(二)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...

  3. ReactiveCocoa源码拆分解析(四)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...

  4. ReactiveCocoa源码拆分解析(六)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...

  5. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

  6. ReactiveCocoa源码拆分解析(三)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 这一章节主要讨论信号的“冷”与“热” 在RAC的世界 ...

  7. Spring源码分析(七)bean标签的解析及注册

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 在上一篇中提到过Spring中的标签包括默认标签和自定义标签两种,而两种 ...

  8. Spring框架之spring-web web源码完全解析

    Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...

  9. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

随机推荐

  1. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...

  2. UVA - 11987 Almost Union-Find[并查集 删除]

    UVA - 11987 Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, y ...

  3. python使用you-get模块下载视频

    pip install you-get # 安装先 怎么用    进入命令行: you-get url 暂停下载:ctrl + c ,继续下载重复  you-get url 官网地址:https:// ...

  4. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  5. KVO设计模式

    一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...

  6. Linux 进程间通讯详解二

    消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的 ...

  7. Javascript 获取链接(url)参数的方法

    有时我们需要在客户端获取链接参数,一个常见的方法是将链接当做字符串,按照链接的格式分解,然后获取对应的参数值.本文给出的就是这个流程的具体实现方法. 当然,我们也可以用正则直接匹配,文章中也给出了一个 ...

  8. VMware三种上网模型

    今天捣鼓了一会虚拟机,对上网方式又学习了一遍,之前摆弄过,现在又捡起来了,主要自己整理一下,方面后面复习.主要有三种网络模型:桥接.仅主机(Host-Only).NAT.自己亲测了这三种方式,都可以上 ...

  9. 修改httpd默认端口号

    Tomcat: vim /etc/httpd/conf/httpd.conf//别忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完 ...

  10. sys

    sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxi ...