(整个关于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源码拆分解析(七)相关推荐

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

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

  2. vue 渲染函数处理slot_Vue源码全面解析七 initRender 函数(处理渲染相关的函数)...

    首先我们打开src/core/instance/render.js'文件,代码如下: export function initRender (vm: Component) { vm._vnode = ...

  3. Spring源码深度解析(郝佳)-学习-源码解析-创建AOP静态代理(七)

    加载时织入(Load-Time Weaving ,LTW) 指的是在虚拟机加载入字节码文件时动态织入Aspect切面,Spring框架的值添加为 AspectJ LTW在动态织入过程中提供了更细粒度的 ...

  4. Soul网关源码阅读(七)限流插件初探

    Soul网关源码阅读(七)限流插件初探 简介     前面的文章中对处理流程探索的差不多了,今天来探索下限流插件:resilience4j 示例运行 环境配置     启动下MySQL和redis d ...

  5. antd源码-spin解析

    antd源码-spin解析 spin的作用是代表当前块正在加载中 Spin 元素的渲染 renderSpin = ({ getPrefixCls }: ConfigConsumerProps) =&g ...

  6. 【笔记-vue】《imooc-vue.js高仿饿了么》、《imooc-vue 音乐app》、《imooc-vue.js源码全方位解析》

    20170709 - 20171128:<imooc-vue.js高仿饿了么> 一.第一章 课程简介 1-1课程简介 1.需求分析-脚手架工具-数据mock-架构设计-代码编写-自测-编译 ...

  7. 《Spring源码深度解析 郝佳 第2版》XML标签的解析

    目录 往期博客<Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 分析了xml文件的加载,接下来就是标签的解析,入口函数有两个 默认标签的解析 自定义标签的解析 一 ...

  8. iOS开发之Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  9. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

最新文章

  1. poi 合并单元格_POI数据获取脚本分享
  2. MATLAB的iptcheckinput函数详解
  3. oracle10 监听日志,windows 清空oracle的监听日志listener.log
  4. 【转】ubuntu,你改变了我的人生
  5. java new 面试_java面试30问
  6. 星益云聚合收银台v1.45开源完整版【最终版本】
  7. 【Level 09】U1 The way I see it L2 Keep everyone safe
  8. mysql多语言运营设计_多语言系统的数据库设计
  9. Linux防火墙配置与管理(16)
  10. 在Linux下使用dnw和u-boot烧写系统
  11. android settheme不起作用,android-主题,样式和别名嵌套不起作用
  12. c 语言回调函数例子,C语言回调函数一个简单的例子
  13. catia导出bom清单_CATIA VBA 二次开发工具 | 一键导出Bom信息到Excel
  14. typedef用法,函数指针
  15. 【信息系统项目管理师】项目管理十大知识领域速记
  16. matlab使用记录--app designer清理图窗、获取当前时间
  17. 《简约至上》阅读整理
  18. 调整UE4屏幕分辨率
  19. 优酷网(Youku.com)架构经验
  20. 用免费邮箱,做你的网络资料“寄存器”

热门文章

  1. 在一个Apapche上部署三个论坛
  2. Jquery 常用方法经典总结
  3. Jfinal集成Spring插件
  4. hpacucli查看HP服务器硬盘状态
  5. JDK源码分析-Integer
  6. [Spring] - 读写分离
  7. XenDesktop中无法删除虚拟机
  8. Android应用屏幕适应问题的解决
  9. windows下python打开中文路径文件出现问题
  10. Network | UDP checksum