最近在一直在学习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. MAYA删除不干净

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

  2. 对象池2(方法功能)Pools

    对象池Pools(主要调用方法功能) namespace kernal { public class Pools : MonoBehaviour { [HideInInspector] public ...

  3. 【转载】CSS3 常用四个动画(旋转、放大、旋转放大、移动)

    http://blog.csdn.net/fungleo/article/details/49848905

  4. REST API 自动化测试 利器Rest Assured(API接口自动化测试框架体系)

    现在,越来越多的 Web 应用转向了 RESTful 的架构,很多产品和应用暴露给用户的往往就是一组 REST API,这样有一个好处,用户可以根据需要,调用不同的 API,整合出自己的应用出来.从这 ...

  5. Xtrareport 报表的一些属性及控件

    基本概念: XtraReports 中的每个报表都由 XtraRepot 类的一个实例表示,或者由该类的子类来表示(这种情况更常见). 因此,每个报表都作为带区的容器使用,而每个带区中都包含报表控件. ...

  6. Java基础入门 - 标识符及其命名规范

    类名.变量名.方法名都称为标识符 标识符命名规范: 由字母(A-Z或a-z).数字.下划线(_)和美元符($)中的一种或多种组合而成 不可以数字开头 大小写敏感 关键字不能用作标识符 合法标识符如:D ...

  7. poj 1741 两点距离小于K(树DP)

    http://blog.csdn.net/woshi250hua/article/details/7723400 求两点间距离小于等于k的方案数 理一下思路: 求通过点A与另一点连接符合条件的个数 = ...

  8. Hibernate课程 初探多对多映射2-4 测试

    package com.ddwei.test; import org.hibernate.Session; import org.hibernate.Transaction; import com.d ...

  9. Java之美[从菜鸟到高手演变]之智力题【史上最全】 (转)

    原文地址:http://blog.csdn.net/zhangerqing/article/details/8138296 PS:在一次偶然的机会中,发现了这篇文章.希望大家能开动脑经. 智力题,每个 ...

  10. 关于jqeury中attr()和prop()方法

    在平时工作中老会被一样的问题困住,浪费时间,这里做一个简要笔记. 在使用jquery给元素设置属性的时候,如果是一般的div,p等正常元素设置属性的话,使用attr()足以,但是在给拥有checked ...