RAC三部曲,1创建信号,2订阅信号,3发送信号,

信号类: RACSiganl

// 1.创建信号
    RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

//3.发送信号
        [subscriber sendNext:@"小四"];

//return [RACDisposable disposableWithBlock:^{ }];取消信号订阅信号不会被触发
        return nil;
    }];

// 2.订阅信号.
    [siganl subscribeNext:^(id x) {
        // 当有信号发出数据,就会调用block.
        NSLog(@"接收到数据:%@",x);
    }];

1. 创建信号,racsignal保存didSubscribe这个block    2.订阅信号,订阅信号代码首先创建一个订阅信号者,保存nextBlock,并在nextBlock里面执行didSubscribe这个Block    3.发送信号 didSubscribe拿到订阅者,调用SendNext发送信号,接着调用刚刚保存的nextBlock执行里面的代码 。

所以,如果没有订阅信号者,那么racsignal保存的didSubscribe这个Block永远不会调用,也就是说发送信号代码永远不会被执行

RACDisposable 可以主动取消信号

//-----------------------------------------------------------------
  RACSubject:信号提供者,自己可以充当信号,又能发送信号

RACSubject *subject = [RACSubject subject];
    
    // 2.订阅信号
    [subject subscribeNext:^(id x) {
        NSLog(@"1订阅者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        NSLog(@"2订阅者%@",x);
    }];
    
    // 3.发送信号
    [subject sendNext:@"小四"];
    
       1创建信号,创建一个subscribers数组  2订阅信号 保存nextBlock,将订阅者添加到subscribers数组中  3发送信号 遍历数组,取出订阅者,执行 nextBlock

//-----------------------------------------------------------------
    RACReplaySubject:重复提供信号类,RACSubject的子类

// 1.创建信号
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
    // 3.发送信号
    [replaySubject sendNext:@1];
    [replaySubject sendNext:@2];
    
    // 2.订阅信号
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第一个订阅者接收到的数据%@",x);
    }];
    
    // 订阅信号
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第二个订阅者接收到的数据%@",x);
    }];
     1 创建信号 分别创建一个subscribers数组和valuesReceived数组 2 订阅信号 保存 nextBlock,遍历valuesReceived数组拿到刚刚创建的RACSuscriber发送数据,如果没有则不发送 4 发送信号 保存发送的数据,遍历所有的订阅者,执行nextBlock。   
    所以 可以先发送信号,再订阅信号,RACSubject就不可以。

RACMulticastConnection

连接信号类 不管有多少个订阅者,只想要发送一次请求

// 1.创建连接类

RACMulticastConnection *connection = [signal publish];

// 2.订阅信号
[connection.signal subscribeNext:^(id x) {

NSLog(@"%@",x);
}];
[connection.signal subscribeNext:^(id x) {

NSLog(@"%@",x);
}];
[connection.signal subscribeNext:^(id x) {

NSLog(@"%@",x);
}];

// 3.连接:才会把源信号变成热信号
[connection connect];

1创建源信号,保存didSubscribe这个block 2.创建连接类,保存信号,还保存着最开始的signal
3订阅信连接类信号创建RACSubject,保存nextBlock,将订阅者添加到subscribers数组中。4 订阅源信号,执行didSubscribe,遍历RACSubject里面所有的订阅者,取出订阅者,执行 nextBlock

ReactiveCocoa总结的更多相关文章

  1. iOS开发之ReactiveCocoa下的MVVM(干货分享)

    最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...

  2. ReactiveCocoa 冷热订阅(cold subscribe, hot subscribe)

    ReactiveCocoa支持两种订阅方式,一种是冷订阅,一种是热订阅. 热订阅的特点: 1.不管有没有消息订阅着,发送者总会把消息发出去. 2.不管订阅者是什么时候订阅的,发送者总是会把相同的消息发 ...

  3. 为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject

    原文解释在这里http://cocoadocs.org/docsets/ReactiveCocoa/0.6.0/ 在标题Creating hot subscribables 底下 先贴原文: The ...

  4. 最快让你上手ReactiveCocoa之基础篇

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,这里介绍一下. 1.Rea ...

  5. [iOS]ReactiveCocoa安装方法

    1. 替换Ruby镜像 我们想要使用CocoaPods来安装ReactiveCocoa.由于OS X上的Ruby镜像被墙了,感谢淘宝为我们提供了国内访问镜像. $ gem sources --remo ...

  6. ReactiveCocoa源码拆分解析(七)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 在这篇博客中,我将把ReactiveCocoa中的擦 ...

  7. ReactiveCocoa源码拆分解析(六)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) RAC为了实现优雅的信号绑定,可谓使尽浑身解数,不仅 ...

  8. ReactiveCocoa源码拆分解析(五)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 好多天没写东西了,今天继续.主要讲解RAC如何于UI ...

  9. ReactiveCocoa源码拆分解析(四)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上一章节简要的说明了如何实现的热信号.但是像那么写, ...

  10. ReactiveCocoa源码拆分解析(三)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 这一章节主要讨论信号的“冷”与“热” 在RAC的世界 ...

随机推荐

  1. My Sql多表操作(转载)

    DELETE 在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录. 假定我们有两张表:Pr ...

  2. 用perl发送数据到钓鱼站

    一个皮皮果的游戏很火 估计很多人想黑 偶然发现一个钓鱼站: http://ppgpergame.com/ 钓用户名与密码 抓包后发现数据会发送到: http://ppgpergame.com/db.a ...

  3. super在构造函数中的运用

    package example;//在子类构造对象时,访问子类构造函数时候,父类也运行.//原因是:在子类的构造函数中第一行有一个默认的隐式语句super();/* 构造函数不能覆盖 子类的实例化过程 ...

  4. 【.NET】上传文件,生成缩略图

    类名:Upload using System; using System.Collections; using System.ComponentModel; using System.Data; us ...

  5. Ubuntu操作相关笔记

    Eclipse添加图标 #sudo vim /usr/share/applications/eclipse.desktop 写入以下内容 [Desktop Entry] Name=Eclipse Co ...

  6. c#委托与事件(详解)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  7. C#6.0新特性之字符串嵌入 String Interpolation

    6.0增加了 字符串嵌入值 的新语法糖. 以前我们做拼接的时候,一般这样写 var s = string.Format("this is a {0} !!!" , class1.p ...

  8. Node.js:EventEmitter

    概要:本篇博客主要介绍EventEmitter Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列.事件由EventEmitter对象提供.下面通过一个例子来说明EventEmitt ...

  9. cmstop核心

    控制器在什么时候实例化?  ---每发送一次请求,都要从入口文件开始一步步往下走 index.php入口文件-->到第二个文件(核心文件cmstop.php)中实例化controller类核心文 ...

  10. 0. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...