文章系列
《RACSignal 》
《RACDisposable》
《RACSubject、RACReplaySubject》
《iOS RAC - 基本用法》
《iOS RAC - 定时器》
《iOS RAC - RACMulticastConnection》
《iOS RAC - RACCommand》
《iOS RAC - 核心方法bind》
《iOS RAC - 集合RACTuple、RACSequence》
《iOS RAC - rac_leftSelector》
《iOS RAC - 映射》
《iOS RAC - 过滤》
《iOS RAC - 登录页面,MVVM》

  • 项目中如果没有使用swift的话使用cocoapods 导入pod ‘ReactiveObjC’, ‘~> 3.0.0’ 然后在导入头文件ReactiveObjC.h 就可以使用了,3.0.0以上的版本支持了swift,如果你是纯OC工程,不建议使用3.0.0以上的版本。

RACSignal:顾名思义,信号类,signal本身不具备发送信号的能力,下面通过代码来看看。

在创建RACSignal中先说一下RAC的三部曲

  • 1 创建信号
  • 2 订阅信号
  • 3 发送信息
 //1、创建信号量RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {NSLog(@"创建信号量");//3、发布信息[subscriber sendNext:@"I'm send next data"];NSLog(@"那我啥时候运行");return nil;}];//2、订阅信号量[signal subscribeNext:^(id  _Nullable x) {NSLog(@"%@",x);}];

代码分析 - 创建信号

[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {return nil;}];

这里要创建一个Signal对象,然后它马上给我一个block,
并且在block中要返回一个RACDisposable对象,
刚开始接触RAC的我哪里知道这个是什么鬼,直接返回nil
至此我们完成了第一步,创建信号

然后其内部实现我们并不了解,于是我们点击进去看看其内部如何实现的。

+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {return [RACDynamicSignal createSignal:didSubscribe];
}

可以看到其内部创建了一个RACDynamicSignal信号,并且把didSubscribe 这个block也传过去了,然后在点进去看看

+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {RACDynamicSignal *signal = [[self alloc] init];signal->_didSubscribe = [didSubscribe copy];return [signal setNameWithFormat:@"+createSignal:"];
}

这段代码意思就很清楚了,创建一个RACDynamicSignal,保存didSubscribe这个block,返回RACDynamicSignal这个对象。

通过上面的了解,我们可以知道,创建信号这个方法内部会帮我们创建一个RACDynamicSignal并且保存一个didSubscribeblock。

但是这个block什么时候调用呢?

没错就是在我们订阅信号的时候调用

代码分析 - 订阅信号

//2、订阅信号量[signal subscribeNext:^(id  _Nullable x) {NSLog(@"%@",x);}];

这里一订阅信号就给我一个block,并且还带一个参数x,并不知道是饿什么东西,就先打印出来。
然后我们点击进去看下内部实现

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {NSCParameterAssert(nextBlock != NULL);RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];return [self subscribe:o];
}
  • 1、创建一个订阅者
+ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed {RACSubscriber *subscriber = [[self alloc] init];subscriber->_next = [next copy];subscriber->_error = [error copy];subscriber->_completed = [completed copy];return subscriber;
}
保存了nextblock
  • 2、 调用subscribe方法
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {NSCParameterAssert(subscriber != nil);RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];//这里判断didSubcribe是否为空if (self.didSubscribe != NULL) {RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{//这里就在调用didSubscribe方法,并且把刚才传入的subscriber调用出去RACDisposable *innerDisposable = self.didSubscribe(subscriber);[disposable addDisposable:innerDisposable];}];[disposable addDisposable:schedulingDisposable];}return disposable;
}
在这个方法中会判断是有有didSubscriber,
如果有就调用block并且把传入进来的subscriber作为block的参数调用出去

订阅信号之后就会运行创建信号的block,

这个时候我们再来看下创建信号的方法

 [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {NSLog(@"创建信号量");//3、发布信息[subscriber sendNext:@"I'm send next data"];NSLog(@"那我啥时候运行");return nil;}];//2、订阅信号量[signal subscribeNext:^(id  _Nullable x) {NSLog(@"%@",x);}];
它给我们一个subscriber
而这个sbuscriber就是我们调用订阅信号的方法所创建的subscriber,然后我们要用这个订阅者发送信息

那我们订阅的信号啥时候调用呢?

  • 当我们的订阅者发送消息的时候就会调用。

这个时候我们看下订阅者发送信息的方法内部做了什么

- (void)sendNext:(id)value {@synchronized (self) {void (^nextBlock)(id) = [self.next copy];if (nextBlock == nil) return;nextBlock(value);}
}

这里的代码很简洁了 主要就是做了一件事,如果nextblock不为空就把传进来传value原封不动的调用出去。 而这个nextblock就是我们在订阅信号的时候创建的那个subscriber所保存的nextblock。

所以RACSignal的处理流程就是

  • 创建信号的block会在订阅信号的时候调用
  • 订阅信号的block会在订阅者发布信息的时候调用

RAC - RACSignal相关推荐

  1. 了解RAC(ReactiveCocoa)

    原文: 一.RAC(ReactiveCocoa)介绍 1.基本介绍 https://www.jianshu.com/p/74f1ea777017 例子:https://download.csdn.ne ...

  2. ReactiveCocoa入门

    概述 为什么要使用RAC? 一个怪怪的东西,从Demo看也没有让代码变得更好.更短,相反还造成理解上的困难,真的有必要去学它么?相信这是大多数人在接触RAC时的想法.RAC不是单一功能的模块,它是一个 ...

  3. iOS 高大上函数响应式编程框架ReactiveCocoa学习笔记1 简介

    ReactiveCocoa函数响应式编程 一.简介 ReactiveCocoa(其简称为RAC)是函数响应式编程框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive ...

  4. RAC rac_liftSelector

    RAC rac_liftSelector 主要是用于线程的同步 - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup ...

  5. IOS响应式编程框架ReactiveCocoa(RAC)使用示例

    本文转载至 http://blog.csdn.net/dfqin/article/details/39164241 IOS ReactiveCocoa RAC 响应式编程 RACSignal Reac ...

  6. RACSignal的Subscription深入分析

    ReactiveCocoa是一个FRP的思想在Objective-C中的实现框架,目前在美团的项目中被广泛使用.对于ReactiveCocoa的基本用法,网上有很多相关的资料,本文不再讨论.RACSi ...

  7. RAC(ReactiveCocoa)使用方法(二)

    RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用 ...

  8. 伟大的RAC和MVVM入门(二)

    之前介绍了MVVM, 现在开始介绍RAC, ReactiveCocoa Functional Core, Imperative Shell view-model 这种通往应用设计的方法是一块应用设计之 ...

  9. RAC ReactiveCocoa 使用小集

    前戏 我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物.ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干 ...

最新文章

  1. Linux新增开放端口
  2. 0417 jsBom操作+Dom再次整理
  3. matplotlib画图中文显示
  4. J2EE架构[三层]
  5. EF实体框架数据操作基类(转)
  6. vue-cli2定制ant-design-vue主题
  7. java中静态代码块的用法 static用法详解
  8. 远程过程调用RPC RMI(Remote Method Invocation)和Web Service
  9. Web后端学习笔记 Flask(7)数据库
  10. ubuntu常见错误及解决
  11. 23hh小说网——爬虫0.1python
  12. 最新计算机专业毕业设计论文选题源码演示录像下载(开题报告任务书PPT毕业答辩模板 jsp70786体育馆售票门票系统 双数据库 mysql版
  13. PMP培训第一次听课笔记(第1-3章)
  14. 科技爱好者周刊(第 209 期):程序员是怎样的人
  15. 《开端》里的循环,人工智能每天都在进行
  16. 【计算机网络】第九章:应用层
  17. 吃猕猴桃,当然不不不不能错过贵州的啦
  18. python的主流开发工具排名,最常用的python开发工具
  19. android listview 导航条,Android侧边导航栏+ListView基础实践
  20. 计算机二级考试地点没有容量,2017年计算机二级office考试点积累

热门文章

  1. pt、px、rpx、em、rem到底是什么
  2. 内部稽核与内部控制管理体系关系的探讨
  3. 3个方法恢复彻底删除的苹果手机视频!
  4. 苹果即将量产microLED,将迫使三星等加快该项技术的进展
  5. puzzle(0151)《24点》
  6. CSDN下载频道2013下半年超人气精华资源汇总
  7. 【ResNet残差网络解析】
  8. CAD制图软件中如何设置选择对象的显示效果?
  9. MySQL基础之索引
  10. 提高计算机主频的方法,cpu主频如何调高