首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

RAC - RACSubject

2024-12-20 来源:化拓教育网
  • RACSubject :信号提供者,自己可以充当信号,又能发送信号。

     使用场景:通常用来代替代理,实现传值
    
  • RACReplySubject :重复提供信号类,RACSubject的子类

    RACReplaySubject 与RACSUbject区别:
        - RACReplaySubject 可以先发送信号,再订阅信号 ,RACSubject不可以
    
        - 使用场景 :
            - 如果一个信号没被订阅一次,就需要把之前的值重新发送一遍,使用重复提供信号类
            - 可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值
    
    
```
 // RACSubject 使用    
// 创建信号
    [RACSubject subject] 跟RACSignal不一样 创建信号时没有bloc
// 订阅信号
 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
// 发送信号
 sendNext:(id)value
 

RACSubject: 底层实现的RACSignal不一样

-  调用subsrcibeNexrt订阅信号 只是把订阅者保存起来 并且订阅者的nextBlock已经赋值了
-  调用sendNext发送信号 , 遍历刚刚保存的多有订阅者,一个一个调用订阅者的nexrBolck

```


```
 1. 创建信号

RACSubject * subject = [RACSubject subject];

[subject subscribeNext:^(id  _Nullable x) {
   //block 调用时刻: 当信号发出新值 就会调动
    NSLog(@"第一个订阅者 调用");
}];

[subject subscribeNext:^(id  _Nullable x) {
   //多次订阅 也会调用
    NSLog(@"第二个订阅者 调用");
}];


[subject sendNext:@1];
```
  /**
    RACReplaySubject 使用步骤:
    
    -  创建信号 [RACSubject subject] , 跟RACSignal 不一样 创建的时候没有block
    
    - 可以先订阅信号 也可以先发送信号
    
    - 订阅信号 - (RACDisposable *) subcribeNext:()
    
    */
    
    
    /**
     RACReplysubject底层实现和RACSubject不一样
     
        -  调用sendNext发送信号,把值保存起来,然后便利刚刚所有保存起来的所有订阅者,一个一个调用订阅者的nextBlock
        -  调用subscribeNext订阅信号,遍历保存的所有值,一个一个调用订阅者的nextBlock
          如果当一个信号被订阅,就重复播放之前所有值,需要先发送信号,在订阅信号;也就是先保存值,在订阅信号
     */
    
    RACReplaySubject * repleySubject =[RACReplaySubject subject];
    
    [repleySubject sendNext:@1];
    
    [repleySubject sendNext:@2];
    
    [repleySubject subscribeNext:^(id  _Nullable x) {
     
        NSLog(@"第一个订阅者接收到的数据%@",x);

    }];
    
    
    [repleySubject subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"第二个订阅者接收到的数据%@",x);
        
    }];
    

显示全文