最近在一直在学习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. Java基础14-多维数组

    1.二位数组可以看成以数组为元素的数组 2.java中多维数组的声明和初始化一样,应该从高维到低维的顺序进行,例如 int[][] a=new int[3][]; a[0]=new int[2]; a ...

  2. LeetCode 454.四数相加 II(C++)

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有的 A ...

  3. 如何在smarty模板中执行php代码

    Smarty模板主要的目的是分离逻辑层和表现层,所以在模板中不应该包含逻辑部分,逻辑层也不应该含有HTML.要在模板中插入逻辑程序的这种做法"非常"不被推荐,在你的case中. 如 ...

  4. phpstorm 10 注册码

    phpstorm 10 注册码 注册时选择License server,填http://idea.lanyus.com,然后点击OK 网上看评论的结果,亲测,有用!!!

  5. Hibernate课程 初探一对多映射2-7 测试-修改和删除学生信息

    package com.ddwei.entity; import java.util.Set; import org.hibernate.Session; import org.hibernate.T ...

  6. 写英文bug的经验总结

    本文链接: https://www.cnblogs.com/hchengmx/p/10800855.html 由于工作原因,开bug的时候需要由英文开,刚开的时候比较痛苦,因为有些词汇老师用的不太准确 ...

  7. JSON FILE NOT FOUND?

    (WIN7+IIS7) 搞一个小测试,一个小程序,用一个JSON文件来显示数据, 用HTML 访问是完全没有问题的,可是一放到IIS下,就出现无法访问, CONSOLE:提示  NOT FOUND 原 ...

  8. SonarQube代码质量管理平台介绍与搭建

    前 言 1.SonarQube的介绍 SonarQube是一个管理代码质量的开放平台. 可以从七个维度检测代码质量(为什么要用SonarQube): (1) 复杂度分布(complexity):代码复 ...

  9. iOS自动化打包发布(fastlane)

    一.FastLane介绍 1.1 FastLane是什么? FastLane是一种配置iOS和Android自动化Beta部署和发布的最简单的方法之一.它可以简化一些乏味.单调.重复的工作,像截图.代 ...

  10. 洛谷 P1266 速度限制

    题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快.一种可以辩解的解决方案 ...