ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载)
上面抽丝剥茧的把最主要的信号机制给分离开了。但在RAC中各种操作也是必不可少的,一些复杂的操作符也是有一些基础操作拼接组合而来,有点搭积木的味道。
那我沿着之前的思路,写一些简单的操作符是如何实现的。
操作符之concat(拼接)
concat 使用示例
QHQSignal *demoOriginSignal = [QHQSignal createSignal:^(id subscriber) {
[subscriber sendNext:@"demoOriginSignal - send"];
[subscriber sendCompleted];
}];
QHQSignal *demoConcatSignal = [QHQSignal createSignal:^(id subscriber) {
[subscriber sendNext:@"demoConcatSignal - send"];
}];
[[demoOriginSignal concat:demoConcatSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
输出内容
2015-12-25 10:02:45.966 PageText[88233:4685875] demoOriginSignal - send
2015-12-25 10:02:45.967 PageText[88233:4685875] demoConcatSignal - send
达到了拼接的效果
实现思路很简单,就是在第一个信号sendcompleted的时候,让subscirber订阅被拼接的信号。
-(QHQSignal *)concat:(QHQSignal *)concatSignal {
return [QHQSignal createSignal:^(id subscriber) {
[self subscribeNext:^(id next) {
[subscriber sendNext:next];
} error:^(NSError *error) {
[subscriber sendError:error];
} completed:^{
[concatSignal subscribe:subscriber];
}];
}];
}
可以看当self(源信号)发送next时,新信号也发送next,发送error,新信号也发送error。发送completed时,让订阅着订阅了被拼接的信号,这样就实现了拼接。
再实现一个复杂些的操作符zip,zip的作用是将2个信号进行压缩。每当2个信号都有新值来时,将两个新值以元组形势返回,demo中以数组返回。(元组可参见swift,这里rac以宏实现了元组的操作)。
QHQSignal *demoOriginSignal = [QHQSignal createSignal:^(id subscriber) {
[subscriber sendNext:@"demoOriginSignal - send- zip1"];
[subscriber sendNext:@"demoOriginSignal - send- zip2"];
}];
QHQSignal *demoConcatSignal = [QHQSignal createSignal:^(id subscriber) {
[subscriber sendNext:@"demoConcatSignal - send - zip1"];
[subscriber sendNext:@"demoConcatSignal - send - zip2"];
}];
[[demoOriginSignal zip:demoConcatSignal] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
输出结果
2015-12-25 11:10:44.546 PageText[89544:4713950] (
"demoOriginSignal - send- zip1",
"demoConcatSignal - send - zip1"
)
2015-12-25 11:10:44.547 PageText[89544:4713950] (
"demoOriginSignal - send- zip2",
"demoConcatSignal - send - zip2"
)
注释掉任意一个send后,都将减少一次输出,如果某个信号不发送内容,那么将不会有输出。
-(QHQSignal *)zip:(QHQSignal *)signal {
return [QHQSignal createSignal:^(id subscriber) {
NSMutableArray *selfArray = [NSMutableArray array];
NSMutableArray *zipArray = [NSMutableArray array];
void (^sendZip)(void) = ^{
if (selfArray.count == 0) return;
if (zipArray.count == 0) return;
NSArray *send = [NSArray arrayWithObjects:selfArray.firstObject, zipArray.firstObject,nil];;
[selfArray removeObjectAtIndex:0];
[zipArray removeObjectAtIndex:0];
[subscriber sendNext:send];
};
[self subscribeNext:^(id x) {
[selfArray addObject:x];
sendZip();
}];
[signal subscribeNext:^(id x) {
[zipArray addObject:x];
sendZip();
}];
}];
}
源码展示:压缩后的信号用两个数组表示压缩前信号的值。直到都有值时,才将信号打包输出。都是比较简单的实现。
剩下操作的可以自己根据源码分析用途了,明白了原理,用起来也更放心。
ReactiveCocoa源码拆分解析(二)的更多相关文章
- ReactiveCocoa源码拆分解析(一)
(整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...
- ReactiveCocoa源码拆分解析(四)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...
- ReactiveCocoa源码拆分解析(七)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...
- 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的世界 ...
- ReactiveCocoa源码解读(二)
上一篇解读了ReactiveCocoa的三个重要的类的底层实现,本篇继续. 一.RACMulticastConnection 1.应用 RACMulticastConnection: 用于当一个信号被 ...
- mybatis源码配置文件解析之二:解析settings标签
在前边的博客中分析了mybatis解析properties标签,<mybatis源码配置文件解析之一:解析properties标签>.下面来看解析settings标签的过程. 一.概述 在 ...
- Android 图片加载框架Glide4.0源码完全解析(二)
写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...
随机推荐
- [tem]RMQ(st)
倍增思想 代码中有两个测试 #include <iostream> #include <cmath> using namespace std; const int N=1e5; ...
- 第54课 Qt 中的多页面切换组件
1. 多页面切换组件(QTabWidget) (1)能够在同一个窗口中自由切换不同页面的内容 (2)是一个容器类型的组件,同时提供友好的页面切换方式 2. QTabWidget的使用方式 (1)在应用 ...
- C++的vector对象
C++的vector使用 标签(空格分隔): C++ 标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象,因为vector容纳着其 ...
- HTML5入门(CSS样式-------------------(CSS基础知识点----------------------------))
CSS继承性+层叠性+盒子+浮动 一.CSS继承性 eg: <style> div{ ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 区域管理功能增强(电子商务方向)
由于公司是面向全国服务的.全国各地都有分公司,需要管理到覆盖全国的各种业务,各种业务系统信息系统的数据都需要规范化. 公司开展网络订单功能,在全国范围内实现网络下单.提高工作效率,提高各公司之间的数据 ...
- Struts2:Json插件_Ajax
lib中加入包 struts2-json-plugin-2.3.20.jar json插件有自己的过滤器.返回类型 WebRoot下新建js文件夹 放入json2.js json2.js是一个著名开源 ...
- mysql重置密码
1.首先停止正在运行的MySQL进程 复制代码代码如下: >net stop mysql 如未加载为服务,可直接在进程管理器或者服务中进行关闭. 2.以安全模式启动MySQL 进入mysql目 ...
- [web建站] 优课急送《零基础快速学习建站》视频+课件【价值399元】
[课程介绍]你想快速建一个网站出来吗?你想从什么都不懂到一两天出一个漂漂亮亮的站吗?你想完成领导交给你的任务找人建站吗?你想自己建站来创业吗?你想学会建站之后,利用给别人建站来赚钱吗?你想建一个跟某个 ...
- 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训
.Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...
- 有利于SEO的DIV+CSS的命名规则
搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前流行的CSS+DIV的命名规则: 页头:header登录条:loginBar标志:logo ...