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);
}];
最新文章
- 智能车学习(二十)——浅谈C车硬连接与软连接
- C#先执行一段sql等后台操作后再提示是否后续操作confrim
- oracle中的timestamp字段的值乱码问题修改
- android --- Afianl框架里面的FinalBitmap加载网络图片
- javascript跨域通信(二):window.name实现的跨域数据传输
- w3school-CSS
- 【转】发布python的包至pypi服务器
- Kail安装Parallels tools
- Python通过Manager方式实现多个无关联进程共享数据
- WAMP集成环境更改web根目录
- java design
- Server.MapPath() 解析
- C#微信公众号开发——错误一
- Cloud TPU Demos(TensorFlow 云 TPU 样例代码)
- WPF实现只打开一个窗口,并且重复打开时已经打开的窗口置顶
- 启用hyper-v后无法卸载vmware
- JavaScript 获取鼠标点击位置坐标
- Netty入门实例及分析
- ELK搭建实时日志分析平台之一ElasticSearch搭建
- 在linux环境下为eclipse配置jdk以及Tomcat服务(附图解详细步骤)
热门文章
- 【Alpha版本】 第八天 11.16
- hdu 2042 - 不容易系列之二
- Yocto开发笔记之《快速入门,环境搭建 &; 编译》(QQ交流群:519230208)
- [NOIP2014] 解方程&;加强版 (bzoj3751 &; vijos1915)
- NSNotificationCenter(通知)与Key-Value Coding (KVC)与Key-Value Observing (KVO)
- 使用iframe实现图片上传预览效果
- WinForm------DockManager控件的使用方法(里面包含DockPanel控件)
- 自然语言0_nltk中文使用和学习资料汇总
- re正则表达式16_managing complex regexes
- Cache-Aside Pattern解析