(整个关于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源码拆分解析(二)的更多相关文章

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

    (整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载) ReactiveCocoa的介绍我就不说了,可以自行百度 ...

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

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

  3. ReactiveCocoa源码拆分解析(七)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...

  4. ReactiveCocoa源码拆分解析(六)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...

  5. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

  6. ReactiveCocoa源码拆分解析(三)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 这一章节主要讨论信号的“冷”与“热” 在RAC的世界 ...

  7. ReactiveCocoa源码解读(二)

    上一篇解读了ReactiveCocoa的三个重要的类的底层实现,本篇继续. 一.RACMulticastConnection 1.应用 RACMulticastConnection: 用于当一个信号被 ...

  8. mybatis源码配置文件解析之二:解析settings标签

    在前边的博客中分析了mybatis解析properties标签,<mybatis源码配置文件解析之一:解析properties标签>.下面来看解析settings标签的过程. 一.概述 在 ...

  9. Android 图片加载框架Glide4.0源码完全解析(二)

    写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...

随机推荐

  1. AutoCAD2006的安装及CASS7.1的配置破解

    -----本文只限于学习交流,商业用途请支持正版! -----转载请注明:http://www.cnblogs.com/mxbs/p/6193190.html 准备: AutoCAD2006.CASS ...

  2. selenium自动化-java-封装断言

    封装的断言. 1 package com.baidu.www; import org.testng.Assert; /* * 封装断言 */ public class assertion { stat ...

  3. spring mvc+ spring +mybatis

    首先,修改web.xml,添加配置文件路由以及格式过滤 <?xml version="1.0" encoding="UTF-8"?> <web ...

  4. Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升

    亲测可用 1.无法启动此程序,因为计算机中丢失mfc42d.dll 我也遇到了这个问题,并且顺利解决了!按一下流程搞定的: “工程-设置-常规-microsoft基础类,(选择使用MFC作为静态链接库 ...

  5. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 面向全国标准省市县行政数据基础之上的组织机构管理

    由于信息系统庞大.各种业务子系统.各种开发语言开发的业务逻辑.各种年代维护的代码.各种参差不齐的历史遗留信息系统,面向全国的业务系统,面向某个领域的汽运管理信息系统,面向内部的业务系统,面向外部的各种 ...

  6. Python-18-Django 基础篇

    1. Web 框架介绍 具体介绍Django之前,必须先介绍WEB框架等概念. Web框架:通俗地讲,就是别人已经设定好的一个web网站模板,你学习它的规则,然后「填空」或「修改」成你自己需要的样子. ...

  7. 开发haproxy管理平台

    1.说明:该脚本仅适用于Linux操作系统2.使用方法: 在该脚本同级目录下要创建一个名字叫做 haproxy 的文件 haproxy 文件内容如下 global log 127.0.0.1 loca ...

  8. hdu2586 LCA

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. QQ个人文件夹中的文件被占用,解决办法

    我的情况是记住密码的账号不可以登录,不记住密码的账号确可以登录,突然就这样,我也很郁闷. 找到路径C:\Users\Public\Documents\Tencent\QQ下的UserDataInfo. ...

  10. iOS特殊字符处理

    你提供的 URL 字符串 里面可能包含某些字符,比如‘$‘ ‘&’ ‘?’...等,这些字符在 URL 语法中是具有特殊语法含义的, 比如 URL :http://www.baidu.com/ ...