[基础]RACSubject

一些知识点

  • RACSubject继承与RACSignal,并且遵循RACSubscriber协议,因此既能当信号,也能发送信号
  • 通常用来代替代理

RACSubject的派生类

  • RACGroupedSignal :分组信号,用来实现 RACSignal 的分组功能。
  • RACBehaviorSubject :重演最后值的信号,当被订阅时,会向订阅者发送它最后接收到的值。
  • RACReplaySubject :重演信号,保存发送过的值,当被订阅时,会向订阅者重新发送这些值。

RACReplaySubject和RACSubject的区别

  • RACSubject必须先订阅信号,才能接收到信号
    1.调用sendNext时,不会保存值,会遍历保存的所有订阅者并执行其nextBlock。
    2.调用subscribeNext时,只是把订阅者和其nextBlock保存起来,但不执行。

  • RACReplaySubject可以先发送信号,再订阅信号
    1.调用sendNext时,会把值保存起来,然后遍历保存的所有订阅者并执行其nextBlock。
    2.调用subscribeNext时,遍历保存的所有值,分别调用本次subscribeNext的订阅者的nextBlock。(就是说当前有多少个值,就调用多少次本次订阅者的nextBlock)

// 1.创建信号 
RACSubject *subject = [RACSubject subject];

//在订阅前发送的话,这个消息是不会被接收到的
[subject sendNext:@"0"];

// 2.订阅信号 
[subject subscribeNext:^(id x) { 
    NSLog(@"第一个订阅者%@",x);
}];
[subject subscribeNext:^(id x) {
    NSLog(@"第二个订阅者%@",x);
 }];
// 3.发送信号 
[subject sendNext:@"1"];

//输出
//第一个订阅者 1
//第二个订阅者 1
//第一个订阅者 2
//第二个订阅者 2
// 1.创建信号
 RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
// 2.发送信号
[replaySubject sendNext:@1];
[replaySubject sendNext:@2];
    
// 3.订阅信号
[replaySubject subscribeNext:^(id x) {
    NSLog(@"第一个订阅者接收到的数据 %@",x);
}];
    
// 订阅信号
[replaySubject subscribeNext:^(id x) {
    NSLog(@"第二个订阅者接收到的数据 %@",x);
}];

//注意如果之后再发送信号,就会按订阅者的顺序发送消息
[replaySubject sendNext:@3];


//输出
//第一个订阅者接收到的数据 1
//第一个订阅者接收到的数据 2
//第二个订阅者接收到的数据 1
//第二个订阅者接收到的数据 2
//第一个订阅者接收到的数据 3    <-- 注意这里后面的顺序变回了“一、二”
//第二个订阅者接收到的数据 3

你可能感兴趣的:([基础]RACSubject)