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 ...
随机推荐
- NOIP模拟赛20161016R1
1.传教士(bishop) 问题描述: panzhili王国的疆土恰好是一个矩形,为了管理方便,国王jjs将整个疆土划分成N*M块大小相同的区域.由于jjs希望他的子民也能信教爱教(”打拳”神教),所 ...
- 第37课 深度解析QMap与QHash
1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...
- GNU make使用变量⑤变量的引用、定义等
在 Makefile 中,变量是一个名字(像是 C 语言中的宏),代表一个文本字符串(变量的值).在 Makefile 的目标.依赖.命令中引用变量的地方,变量会被它的值所取代(与 C 语言中宏引用的 ...
- NOI2018准备Day13晚
今晚很困.很困,看题解做了一道钻石级的题,数独发生了神奇的错误,=_=
- sql总结(3)---比较全
一.交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐 ...
- js jQuery取消添加超链接的方法小结
今天在工作中需要将某个链接给取消实现只触发事件的目的,后来发现批量取消链接等,脚本之家简单的给整理了下,希望对需要的朋友有所帮助. 单个链接取消链接并触发js事件 <a href="j ...
- Codeforces Canda Cup 2016
A.B:模拟 C.构造下就行了 D.题意:n个参加ACM的队(n<=300000),每个队都有自己的初始气球数和重量,规定如果气球数>重量,那么此队就会飞起来,淘汰出局,你现在是第一组,你 ...
- jQuery之XML的加载和解析
1.XML(eXtensible Markup Language)即可扩展标记语言,与HTML一样,都是SGML标准通用语言.语法如下: 任何起始标签都必须有一个结束标签. 可以采用另一种简化语法,即 ...
- VS2010 MFC对Excel的操作
这是帮别人做项目遇到的一个问题,的那个是纠结了老长时间,本以为是一件很轻松的事... 首先,这里采用了OLE来对Excel进行操作,网上其实有大把的例子,虽然都可以运行,但是并不能满足项目要求,其实我 ...
- bc#54 div2
用小号做的div2 A:竟然看错了排序顺序...白白WA了两发 注意读入一整行(包括空格):getline(cin,st) [gets也是资瓷的 #include<iostream> us ...