美文网首页
RAC - 01 - RACSignal

RAC - 01 - RACSignal

作者: 文瑶906 | 来源:发表于2018-08-14 11:24 被阅读0次

万物皆信号:任何事件都是通过信号去传递的。

一、 基本

RACSignal

  • 信号:只有订阅 的时候才能运行
  • 它是 ReactiveCocoa 最基本的类,任何地方都会用到它
  • 响应式编程思想,只要信号一变化,马上通知你
  • 信号本身不不具备发送消息的能力

RACDisposable

  • 专门处理数据的
  • 比如一些数据不要了,它就会去清空这些数据

RACSubscriber

  • 订阅者
  • 用它去发送跟信号相关的消息
  • 信号本身不不具备发送消息的能力,是因为有一个订阅者才能发送消息。
//  创建一个信号 createSignal:^RACDisposable 其实就是函数式编程思想
   RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        // 在这个里面返回一个 RACDisposable 
        
    }];

/* 上面的方法的定义:
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
    return [RACDynamicSignal createSignal:didSubscribe];
}
*/
  • 如何创建 RACDisposable 对象?
    点击 RACDisposable 进入 它的类中,会看到 + (instancetype)disposableWithBlock:(void (^)(void))block; 方法。这个方法就是用来创建的。
   // 创建 RACDisposable
        return [RACDisposable disposableWithBlock:^{
            // 清空数据的操作写在这里
        }];

二、 block 的执行时间 及 作用

  1. 创建信号以后,只有订阅了才能执行 block 里面的数据。
  2. 有三种订阅
  • 信号传的值: - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
  • 订阅信号的错误信息: - (RACDisposable *)subscribeError:(void (^)(NSError *error))errorBlock
  • 订阅完成: - (RACDisposable *)subscribeCompleted:(void (^)(void))completedBlock
  • 也可以两个,三个一起订阅 : (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock
  1. 现在的代码如下:
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        // 创建 RACDisposable
        return [RACDisposable disposableWithBlock:^{
            
        }];
    }];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"信号的值 = %@",x);
    }];

3.1 这段代码,并没有打印 信号的值,因为 没有在 RACSignal createSignal 这个方法中 给 signal subscribeNext方法传值。

  1. 如何传值?使用 createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber 方法中的 subscriber .
  2. 拿到 订阅者,才能给 subscribeNext 发送消息
   [subscriber sendNext:@2];
   [subscriber sendError:<#(nullable NSError *)#>];
   [subscriber sendCompleted];
  1. 现在有3个block,他们的顺序是

    • createSignal
    • subscribeNext
    • disposableWithBlock
    • 先订阅,在发送消息
    • 在订阅的时候会执行 RACSignal 的 block
    • 18:32
  2. 读源码:

// 1. 调用的方法
 [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber)

// 2.  createSignal 里面的源码
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
        //  RACDynamicSignal : 创建动态信号
    return [RACDynamicSignal createSignal:didSubscribe];
}

// 3. createSignal:didSubscribe 方法的源码
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
        // 创建动态的信号
    RACDynamicSignal *signal = [[self alloc] init];
    signal->_didSubscribe = [didSubscribe copy];
    return [signal setNameWithFormat:@"+createSignal:"];
}
Snip20180814_38.png
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"信号的值 = %@",x);
    }];
    
    [signal subscribeError:^(NSError * _Nullable error) {
        <#code#>
    }];

    [signal subscribeCompleted:^{
        <#code#>
    }];

上面这段代码的写法是错误的
因为这样写会多次走到 createSignal方法中。
可以使用

 [signal subscribeNext:^(id  _Nullable x) {
        // 订阅信号的值
    } error:^(NSError * _Nullable error) {
        // 订阅错误
    } completed:^{
        // 订阅完成
    }];

相关文章

  • RAC - 01 - RACSignal

    万物皆信号:任何事件都是通过信号去传递的。 一、 基本 RACSignal 信号:只有订阅 的时候才能运行 它是 ...

  • RACSignal介绍

    RACSignal 在RAC中最核心的类RACSignal,搞定这个类就能用ReactiveCocoa了。 RAC...

  • (一)、iOS RAC - RACSignal

    (一)、iOS RAC - RACSignal (二)、iOS RAC - RACDisposable(三...

  • RAC的基本使用

    RAC的基本使用 在RAC中,一切都是信号! RACSignal RACSignal实例化一个信号,首先,需要创建...

  • RAC 组合combine

    RAC(_btn,enabled) = [RACSignal combineLatest:@[_accountTe...

  • iOS开发 「RAC」用RAC实现界面有多个请求都完成后再刷新界

    - (RACSignal *)rac_liftSelector:(SEL)selector withSignals...

  • RAC - RACSignal

    信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据们就会马上发出数据。 信号类,只是表示当前数据改...

  • Rac迭代

    Rac迭代、绑定、JoinRACStream、RACSignal、RACSequence 1、RACSequenc...

  • RAC学习(一)RACSignal & RACDispo

    一、RAC是什么? 二、RAC有什么用? 三、引入RAC OC版本 四、详解 1、RACSignal:信号类 创建...

  • RAC源码解析

    RAC是一个函数响应编程框架。 先来一个简单的RAC使用: RACSignal使用步骤:1.创建信号 + (RAC...

网友评论

      本文标题:RAC - 01 - RACSignal

      本文链接:https://www.haomeiwen.com/subject/ifvkbftx.html