RACSignal

文章:一缕殇流化隐半边冰霜 https://www.jianshu.com/p/d7d951a99db8

 

 

2

ReactiveCocoa 中最核心的概念之一就是信号 RACStreamRACStream 中有两个子类:RACSignalRACSequence

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

注意:

  • 当数据改变时,信号内部会发出数据,RACSiganl 本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
  • 默认一个信号都是冷信号,就是值改变了也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
  •  如何订阅信号:调用信号 RACSignalsubscribeNext 就能订阅。
  •  订阅的信号只有一次有效性。当向第二个订阅者发送数据时,第一个订阅者是收不到信息的。
  RACSiganl 简单使用:
/*  RACSignal 底层实现:
    1.创建信号,首先把 didSubscribe 保存到信号中,还不会触发。
    2.当信号被订阅,也就是调用 signal 的 subscribeNext:nextBlock
        2.2 subscribeNext 内部会创建订阅者 subscriber,并且把 nextBlock 保存到 subscriber 中。
        2.1 subscribeNext 内部会调用 siganl 的 didSubscribe
    3.siganl 的 didSubscribe 中调用 [subscriber sendNext:@1];
        3.1 sendNext 底层其实就是执行 subscriber 的 nextBlock
*/
// 1.创建信号
RACSignal * siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    // block 调用时机:每当有订阅者订阅信号,就会调用 block

    // 2.发送信号
    [subscriber sendNext:@1];

    // 如果不再发送数据,最好发送信号完成,内部会自动调用 [RACDisposable disposable] 取消订阅信号
    [subscriber sendCompleted];
    
    return [RACDisposable disposableWithBlock:^{
        // block 调用时机:当信号发送完成或者发送错误,就会自动执行这个 block,取消订阅信号
        // 执行完 Block 后,当前信号就不再被订阅了
        NSLog(@"信号被销毁");
    }];
}];
   
// 3.订阅信号,才会激活信号
[siganl subscribeNext:^(id x) {
    // block 调用时机:每当有信号发出数据,就会调用 block
    NSLog(@"接收到数据:%@", x);
}];

这是一个 RACSignal 被订阅的完整过程。被订阅的过程中,究竟发生了什么?

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

RACSignal 调用 createSignal 的时候,会调用 RACDynamicSignalcreateSignal 的方法。而 RACDynamicSignalRACSignal 的子类。

 

You may also like...