ReactiveCocoa源码拆分解析(七)
(整个关于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,当用户点击了减号按钮时,可以传递一个减号操作符,也就是上面最后一个。
转载于:https://www.cnblogs.com/qianhongqiang/p/5189968.html
ReactiveCocoa源码拆分解析(七)相关推荐
- ReactiveCocoa源码拆分解析(四)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...
- vue 渲染函数处理slot_Vue源码全面解析七 initRender 函数(处理渲染相关的函数)...
首先我们打开src/core/instance/render.js'文件,代码如下: export function initRender (vm: Component) { vm._vnode = ...
- Spring源码深度解析(郝佳)-学习-源码解析-创建AOP静态代理(七)
加载时织入(Load-Time Weaving ,LTW) 指的是在虚拟机加载入字节码文件时动态织入Aspect切面,Spring框架的值添加为 AspectJ LTW在动态织入过程中提供了更细粒度的 ...
- Soul网关源码阅读(七)限流插件初探
Soul网关源码阅读(七)限流插件初探 简介 前面的文章中对处理流程探索的差不多了,今天来探索下限流插件:resilience4j 示例运行 环境配置 启动下MySQL和redis d ...
- antd源码-spin解析
antd源码-spin解析 spin的作用是代表当前块正在加载中 Spin 元素的渲染 renderSpin = ({ getPrefixCls }: ConfigConsumerProps) =&g ...
- 【笔记-vue】《imooc-vue.js高仿饿了么》、《imooc-vue 音乐app》、《imooc-vue.js源码全方位解析》
20170709 - 20171128:<imooc-vue.js高仿饿了么> 一.第一章 课程简介 1-1课程简介 1.需求分析-脚手架工具-数据mock-架构设计-代码编写-自测-编译 ...
- 《Spring源码深度解析 郝佳 第2版》XML标签的解析
目录 往期博客<Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 分析了xml文件的加载,接下来就是标签的解析,入口函数有两个 默认标签的解析 自定义标签的解析 一 ...
- iOS开发之Masonry框架源码深度解析
Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
最新文章
- poi 合并单元格_POI数据获取脚本分享
- MATLAB的iptcheckinput函数详解
- oracle10 监听日志,windows 清空oracle的监听日志listener.log
- 【转】ubuntu,你改变了我的人生
- java new 面试_java面试30问
- 星益云聚合收银台v1.45开源完整版【最终版本】
- 【Level 09】U1 The way I see it L2 Keep everyone safe
- mysql多语言运营设计_多语言系统的数据库设计
- Linux防火墙配置与管理(16)
- 在Linux下使用dnw和u-boot烧写系统
- android settheme不起作用,android-主题,样式和别名嵌套不起作用
- c 语言回调函数例子,C语言回调函数一个简单的例子
- catia导出bom清单_CATIA VBA 二次开发工具 | 一键导出Bom信息到Excel
- typedef用法,函数指针
- 【信息系统项目管理师】项目管理十大知识领域速记
- matlab使用记录--app designer清理图窗、获取当前时间
- 《简约至上》阅读整理
- 调整UE4屏幕分辨率
- 优酷网(Youku.com)架构经验
- 用免费邮箱,做你的网络资料“寄存器”