最近在一直在学习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框架的简单介绍的更多相关文章

  1. client高性能组件化框架React简单介绍、特点、环境搭建及经常使用语法

    [本文源址:http://blog.csdn.net/q1056843325/article/details/54729657 转载请加入该地址] 明天就是除夕了 预祝大家新春快乐 [ ]~( ̄▽ ̄) ...

  2. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

  3. java框架复习 简单介绍 (转载)

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...

  4. dubbo框架的简单介绍

    以下的官网的介绍. dubbo是SOA.小例子是简单的远程调用(生产者消费者的模式出现).http://blog.csdn.net/huangyekan/article/details/4217267 ...

  5. hadoop备战:yarn框架的简单介绍(mapreduce2)

    新 Hadoop Yarn 框架原理及运作机制 重构根本的思想是将 JobTracker 两个基本的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控.新的资源管理器全局管理全部应用程序计 ...

  6. 权限控制框架Shiro简单介绍及配置实例

    Shiro是什么 http://shiro.apache.org/ Apache Shiro是一个非常易用的Java安全框架,它能提供验证.授权.加密和Session控制.Shiro非常轻量级,而且A ...

  7. OC - 7.Foundation框架的简单介绍

    OC语言-07-OC语言-Foundation框架   结构体 NSRange/CGRange 用来表示一个元素在另一个元素中的范围,NSRange等价于CGRange 包含两个属性: NSUInte ...

  8. 前端框架VUE----es6简单介绍

    1.ECMAScript 6 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScr ...

  9. SQLite数据库框架--FMDB简单介绍

    1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比 ...

随机推荐

  1. inventor安装失败怎样卸载安装inventor 2014?

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  2. 错误:子进程 已安装 pre-removal 脚本 返回了错误号 1

    解决办法 sudo rm /var/lib/dpkg/info/<package name>.*

  3. kindEditor完整认识 PHP上调用并上传图片说明

    最近又重新捣鼓了下kindeditor,之前写的一篇文章http://hi.baidu.com/yanghbmail/blog/item/c681be015755160b1d9583e7.html感觉 ...

  4. iOS 状态栏设置为白色

    1.首先需要再info.plist中添加一项View controller-based status bar appearance为no 2.在需要的地方添加代码 [[UIApplication sh ...

  5. webapi 开启跨域支持

    1.Global文件: GlobalConfiguration.Configuration.EnableCors(); 2.需要跨域的action或controller添加跨域规则 [EnableCo ...

  6. ansible软件相关模块丶计划任务,剧本

    软件相关模块 yum rpm 和yum 的区别 rpm:redhat package manager yum可以解决依赖关系 yum 源配置 [epel] name=Extra Packages fo ...

  7. Eclipse Infrastructure

    Everything is plug-ins running on or loaded by plug-ins loader called by a small kernal which is an ...

  8. ArcSDE空间数据库中SDE用户使用探讨(转)

    ArcSDE作为空间数据库解决方案,应用非常广泛,本短文将尝试描述SDE的工作机制,简要说明空间数据 库中SDE用户的使用方法. ArcSDE如何工作 ArcSDE属于中间件技术,其本身并不能够存储空 ...

  9. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息

    组里最近遇到一个问题,微软的Azure Service Bus Queue是否可靠?是否会出现丢失消息的情况? 具体缘由如下, 由于开发的产品是SaaS产品,为防止消息丢失,跨Module消息传递使用 ...

  10. AIR Native Extension for iOS 接入第三方sdk 如何实现 AppDelegate 生命周期

    作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/6492385.html 原创文章,转载请注明作者和出处,未经允许不可用于商业营利活动 去年到今年做 ...