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,当用户点击了减号按钮时,可以传递一个减号操作符,也就是上面最后一个。
ReactiveCocoa源码拆分解析(七)的更多相关文章
- ReactiveCocoa源码拆分解析(一)
(整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...
- ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...
- ReactiveCocoa源码拆分解析(四)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...
- ReactiveCocoa源码拆分解析(六)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...
- ReactiveCocoa源码拆分解析(五)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...
- ReactiveCocoa源码拆分解析(三)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 这一章节主要讨论信号的“冷”与“热” 在RAC的世界 ...
- Spring源码分析(七)bean标签的解析及注册
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 在上一篇中提到过Spring中的标签包括默认标签和自定义标签两种,而两种 ...
- Spring框架之spring-web web源码完全解析
Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
随机推荐
- java中的大数BigInteger
compareTo比较大小 equals比较是否相等 ,不能用== while(cin.hasNext())//等价于!=EOF n=cin.nextBigInteger();//读入一个大整数 Sy ...
- 2016中国·西安“华山杯”WriteUp- SeeSea
题目打包下载:https://yunpan.cn/ckyrKxHJDPAIN (提取码:bbaf) Web 1.签到(10) 扫码回复 hs_ctf拿flag, 套路题. flag_Xd{hSh_ct ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 总部业务部门主管管理整个集团分公司的某项业务
由于整个集团公司非常庞大,有上千个分支机构,不可能由总部某个人能管理所有的数据,或者掌握所有的业务.某个业务都会由于某个相应的部门进行管理,例如所有分公司的人力资源,都由总部的人力资源部门管理.哪些分 ...
- java并发编程学习: ThreadLocal使用及原理
多线程应用中,如果希望一个变量隔离在某个线程内,即:该变量只能由某个线程本身可见,其它线程无法访问,那么ThreadLocal可以很方便的帮你做到这一点. 先来看一下示例: package yjmyz ...
- bzoj 1296: [SCOI2009]粉刷匠
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- 老生长谈:css实现右侧固定宽度,左侧宽度自适应
反过来也可以:左侧宽度固定,右侧自适应.不管是左是右,反正就是一边宽度固定,一边宽度自适应. 这种布局比较常见,博客园很多默认主题就是这种.一般情况下,这种布局中宽度固定的区域是侧边栏,而自适应的区域 ...
- 使用startActivityForResult场景模拟
效果图如下,当我从第一个界面选择供应商的时候,我希望能得到第二个界面选择的供应商的值: 具体代码,这里第二个参数为自定义的大于等于0的数字,用来标记当前跳转. Intent i1 = new Inte ...
- Jenkins入门系列之——03PDF文档下载
啥都不说了,网页看着蛋疼的,自己下载pdf文档吧. 点击下载文档 http://files.cnblogs.com/zz0412/jenkins%E5%85%A5%E9%97%A8%E6%89%8B% ...
- 利用 lucene.net 实现高效率的 WildcardQuery ,记一次类似百度搜索下拉关键字联想功能的实现。
打开百度输入 站内搜索也要实现类似功能.最基础的做法,写个方法查数据库搜索历史综合表keywordSearch(先将被搜索过的关键字记录到一张表,记录好他们被搜索的次数.上次搜索的有多少结果) 大概 ...
- windows2012 iis配置
1.打开“组策略” 单击任务栏里的“windows powershell”, 键入 gpedit.msc,然后按 Enter. 2.修改windows 更新源为未配置.“计算机配置”---“管理模板” ...