ReactiveObjC框架的简单介绍
最近在一直在学习RAC框架的Object-C版本ReactiveObjC(Swift版本为ReactiveSwift),这篇文章简单展示一下学习的成果!!!如果有什么地方理解错误,欢迎大家指正!!!互相学习......
ReactiveObjC 这里只是抛砖引玉!!!如果有什么理解不到位的,欢迎批评指正,共同进步!!!
如果你不想了解底层是怎么实现的,那么直接上代码 -----> ReactiveObjC使用
RAC框架中的继承关系(不包含分类)
注意:
1、关于底层实现是三方已经自动帮我们实现的过程,我们只需要,学会使用步骤就行了,当然多了解底层原理有助于我们提升自己的能力!!!
2、不同类型信号的订阅,处理的事情不一样。
#pragma mark -- RAC/RACSignal
RACSignal使用步骤:
1、创建信号: + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;
2、订阅信号:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3、发送信号:- (void)sendNext:(id)value;
特点:先订阅,后发送。
RACSignal底层实现:
1、创建信号:把didSubscribe(代码块)保存到信号中
2、订阅信号:调用signal的subscribeNext:(void (^)(id x))nextBlock
3、调用RACDynamicSignal的didSubscribe把订阅者传递过去
4、[subscriber sendNext:@1]; 调用订阅者的发送消息的方法,发送消息
5、执行nextBlock这个代码块
代码实现
//1、创建订阅者
RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { //3、发送信号,发送信号之前一定要先订阅信号
[subscriber sendNext:@""]; return nil;
}]; //2、订阅信号
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"--%@", x);
}];
图例:
#pragma mark -- RACSubject
RACSubject使用步骤:
1、创建信号: + (instancetype)subject;
2、订阅信号:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3、发送信号:- (void)sendNext:(id)value;
特点:先订阅,后发送。
RACSubject底层实现
1.调用subscribeNext订阅信号,把订阅者保存起来,并且订阅者的nextBlock中已经赋值了。
2.调用sendNext发送信号,遍历刚刚保存的所有订阅者,分别调用订阅者的nextBlock。
代码实现:
//1.创建信号
RACSubject *subject = [RACSubject subject]; //2.订阅信号
[subject subscribeNext:^(id x) {
// block调用时刻:当信号发出新值,就会调用.
NSLog(@"第一个订阅者%@",x);
}]; [subject subscribeNext:^(id x) {
// block调用时刻:当信号发出新值,就会调用.
NSLog(@"第二个订阅者%@",x);
}]; //3.发送信号
[subject sendNext:@""];
图例:
#pragma mark -- RACReplaySubject
RACReplaySubject使用步骤:
1、创建信号: + (instancetype)subject;
2/3、订阅信号:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3/2、发送信号:- (void)sendNext:(id)value;
特点:可以先订阅信号,也可以先发送信号
RACReplaySubject底层实现
1.调用sendNext发送信号,把需要发送的信号保存起来,然后遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock。
2.调用subscribeNext订阅信号,遍历保存的所有值,一个一个调用订阅者的nextBlock
如果想要当一个信号被订阅,就重复播放之前所有值,需要先发送信号,在订阅信号。(也就是先保存值,再订阅值。)
代码实现:(先发送后订阅)
// 1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 2.发送信号
[replaySubject sendNext:@];
[replaySubject sendNext:@]; // 3.订阅信号
[replaySubject subscribeNext:^(id x) { NSLog(@"第一个订阅者接收到的数据%@",x);
}]; // 订阅信号
[replaySubject subscribeNext:^(id x) { NSLog(@"第二个订阅者接收到的数据%@",x);
}];
控制台打印:(先发送后订阅)
每一个订阅者接收全部信号(信号已经全部保存完毕)
第一个订阅者接收到的数据1
第一个订阅者接收到的数据2
第二个订阅者接收到的数据1
第二个订阅者接收到的数据2
图例:(先发送后订阅)
代码实现:(先订阅后发送)
// 1.创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 2.订阅信号
[replaySubject subscribeNext:^(id x) { NSLog(@"第一个订阅者接收到的数据%@",x);
}]; // 订阅信号
[replaySubject subscribeNext:^(id x) { NSLog(@"第二个订阅者接收到的数据%@",x);
}]; // 3.发送信号
[replaySubject sendNext:@];
[replaySubject sendNext:@];
控制台打印:(先订阅后发送)
全部订阅者接收同一个信号(订阅者已经全部保存完毕)
第一个订阅者接收到的数据1
第二个订阅者接收到的数据1
第一个订阅者接收到的数据2
第二个订阅者接收到的数据2
图例:(先订阅后发送)
如果你不想了解底层是怎么实现的,那么直接上代码 -----> ReactiveObjC使用
更多内容--> 博客导航 每周一篇哟!!!
有任何关于iOS开发的问题!欢迎下方留言!!!或者邮件lieryangios@126.com 虽然我不一定能够解答出来,但是我会请教iOS开发高手!!!解答您的问题!!!
ReactiveObjC框架的简单介绍的更多相关文章
- client高性能组件化框架React简单介绍、特点、环境搭建及经常使用语法
[本文源址:http://blog.csdn.net/q1056843325/article/details/54729657 转载请加入该地址] 明天就是除夕了 预祝大家新春快乐 [ ]~( ̄▽ ̄) ...
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
- java框架复习 简单介绍 (转载)
一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...
- dubbo框架的简单介绍
以下的官网的介绍. dubbo是SOA.小例子是简单的远程调用(生产者消费者的模式出现).http://blog.csdn.net/huangyekan/article/details/4217267 ...
- hadoop备战:yarn框架的简单介绍(mapreduce2)
新 Hadoop Yarn 框架原理及运作机制 重构根本的思想是将 JobTracker 两个基本的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控.新的资源管理器全局管理全部应用程序计 ...
- 权限控制框架Shiro简单介绍及配置实例
Shiro是什么 http://shiro.apache.org/ Apache Shiro是一个非常易用的Java安全框架,它能提供验证.授权.加密和Session控制.Shiro非常轻量级,而且A ...
- OC - 7.Foundation框架的简单介绍
OC语言-07-OC语言-Foundation框架 结构体 NSRange/CGRange 用来表示一个元素在另一个元素中的范围,NSRange等价于CGRange 包含两个属性: NSUInte ...
- 前端框架VUE----es6简单介绍
1.ECMAScript 6 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScr ...
- SQLite数据库框架--FMDB简单介绍
1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比 ...
随机推荐
- caffe学习资料
1.利用Caffe做回归(regression) http://www.cnblogs.com/frombeijingwithlove/p/5314042.html
- Neutron命令测试4
jolin@jolin:~$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface ...
- net图片转格式
http://blog.csdn.net/nrlovestudy/article/details/48137339 图片转格式 Bitmap bmp=new Bitmap("filename ...
- C# 字节数组和十六进制字符串之间转换的另类写法
今天从http://www.cnblogs.com/NanaLich/archive/2012/05/24/2516860.html看到的,记录下来 主要是XmlSerializationReader ...
- image压缩
public byte[] compressPic(byte[] data) { if(data.length == 0){ return new byte[0]; } Image img = nul ...
- java虚拟机之GC(转)
垃圾回收主要内容: 1. 那些内存需要回收? 2. 什么时候回收? 3. 如何回收? 垃圾回收主要针对运行时数据区那些区域? 运行时数据区的线程私有区域有:虚拟机栈,本地方法栈,程序计数器等: 栈中的 ...
- JQ单双引号转义
var temp = "${row.address_province}"; alert(temp);——————即变量temp alert("\'"+temp+ ...
- LotusScript_导出数据库路径和名称
对服务器有些数据库需要建立复本,新建拷贝,修改权限(ACL),或是修改数据库标识符(ID)需要找到这些数据库.这个方法是导出指定服务器上所有数据库的路径,数据库名,标识符等信息,导出后对Excel表格 ...
- Android环信即时通讯集成坑爹 注册报错208解决
第一种情况: 你用的环信APPkey 是授权模式的 只要改成开放模式就可以了 第二种情况: 上述情况在环信官网都有说明 但是这种情况 环信官网就没得说明 只说的是同步方法 注册 ...
- System Center Configuration Manager 2016 配置安装篇(Part1)
SCCM 2016 配置管理系列(Part 1- 4) 介绍AD01上配置了Active Directory域服务(ADDS),然后将Configuration Manager服务器(CM16)加入到 ...