RAC - 01 - RACSignal

2018-08-14  本文已影响0人  文瑶906

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

一、 基本

RACSignal

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
        return [RACDisposable disposableWithBlock:^{
            // 清空数据的操作写在这里
        }];

二、 block 的执行时间 及 作用

  1. 创建信号以后,只有订阅了才能执行 block 里面的数据。
  2. 有三种订阅
  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:^{
        // 订阅完成
    }];
上一篇 下一篇

猜你喜欢

热点阅读