ReactiveCocoa源码拆分解析(一)
(整个关于ReactiveCocoa的工程可以在https://github.com/qianhongqiang/QHQReactive下载)
ReactiveCocoa的介绍我就不说了,可以自行百度。ReactiveCocoa这个框架目前来看很热门,但是不流行。归根到底,是学习成本太高,光看头文件,你几乎就根本不知道该如何使用。ReactiveCocoa内部实现大量使用了block,在block嵌套比较深的情况下,阅读源码也变得困难。我这里就给大家做个抽离,分解各个模块。因为我刚开始阅读时,我甚至于不知道该如何入手。源码解析如有错误,欢迎指正。
首先我先展示一段ReactiveCocoa的代码
```
RACSignal *signal = [RACSignal createSignal:^(id subscriber) {
[subscriber sendNext:[NSDate date]];
[subscriber sendCompleted];
return
nil;
}];
[signal subscribeNext:^(id x) {
NSLog(@
"next:%@"
, x);
} error:^(NSError *error) {
NSLog(@
"error:%@"
, error);
} completed:^{
NSLog(@
"completed"
);
}];
@interface QHQSignal ()
@property (nonatomic, copy) void (^didSubscriber)(id subscriber);
@property (nonatomic, strong) QHQSubscriber *scriber;
@end
@implementation QHQSignal
+(QHQSignal *)createSignal:(void (^)(id subscriber))didSubscriber {
QHQSignal *signal = [[self alloc] init];
signal.didSubscriber = didSubscriber;
return signal;
}
-(void)subscribeNext:(void (^)(id))nextBlock {
QHQSubscriber *scriber = [QHQSubscriber subscriberWithNextBlock:nextBlock];
self.scriber = scriber;
self.didSubscriber(self.scriber);
}
@end
@interface QHQSubscriber ()
@property (nonatomic, copy) void(^nextBlock)(id x);
@property (nonatomic, copy) void(^completionBlock)(id x);
@property (nonatomic, copy) void(^errorBlock)(id x);
@end
@implementation QHQSubscriber
+(instancetype)subscriberWithNextBlock:(void (^)(id x))nextBlock {
return [self subscriberWithNextBlock:nextBlock completionBlock:nil errorBlock:nil];
}
+(instancetype)subscriberWithNextBlock:(void (^)(id x))nextBlock completionBlock:(void (^)(id x))completionBlock errorBlock:(void (^)(id x))errorBlock {
QHQSubscriber *subscriber = [[QHQSubscriber alloc] init];
subscriber.nextBlock = nextBlock;
subscriber.completionBlock = completionBlock;
subscriber.errorBlock = errorBlock;
return subscriber;
}
-(void)sendNext:(id)next {
if (self.nextBlock) {
self.nextBlock(next);
}
}
@end
QHQSignal *demoSignal = [QHQSignal createSignal:^(id subscriber) {
[subscriber sendNext:@"1"];
}];
[demoSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
ReactiveCocoa源码拆分解析(一)的更多相关文章
- ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...
- 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的世界 ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- spring源码深度解析— IOC 之 开启 bean 的加载
概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中.至此,Spri ...
- Spring框架之spring-web web源码完全解析
Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...
随机推荐
- UVa 11149 Power of Matrix(倍增法、矩阵快速幂)
题目链接: 传送门 Power of Matrix Time Limit: 3000MS Description 给一个n阶方阵,求A1+A2+A3+......Ak. 思路 A1+A2+. ...
- BZOJ1588[HNOI2002]营业额统计
传送门 平衡树常规题,给出两种实现算法 Treap版: //OJ 1610 //by Cydiater //2016.9.1 #include <iostream> #include &l ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- 最短路径(Floyd)算法
#include <stdio.h>#include <stdlib.h>/* Floyd算法 */#define VNUM 5#define MV 65536int P[VN ...
- elasticsearch api
count curl -XGET http://21.3.5.121:9200/ipv4geo/service/_count -d '{"query":{"match&q ...
- eclipse中SSH三大框架环境搭建<一>
这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...
- 和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)
转自http://blog.csdn.net/bluishglc/article/details/7585965 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统 ...
- yourphp基本语句
实例化页面代码 1.时间代码:{$vo.createtime|toDate=###,'Y-m-d H:i:s'} 2.连接:{:U('Pro/arr')},{:URL()} 如:<form ac ...
- lightbox图片展示效果
1.lightbox 头部导入: <script type="text/javascript" src="../Public/Js/prototype.js&quo ...
- EF批量插入 扩展
https://efbulkinsert.codeplex.com/ https://github.com/loresoft/EntityFramework.Extended