ReactiveCocoa(I)

ReactiveCocoa常见类

1. RAC中最核心的类RACSiganl:

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

解析:

  • 信号类(RACSiganl),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。

  • 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。

  • 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。

 1 //    创建信号,首先把didSubscribe保存到信号中,还不会触发
 2     + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe
 3     
 4 //    订阅信号,才会激活信号
 5     - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
 6     
 7 //    当信号被订阅,也就是调用signal的subscribeNext:nextBlock
 8 //    subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中
 9 //    subscribeNext内部会调用siganl的didSubscribe
10     
11     
12 //    发送信号
13     - (void)sendNext:(id)value
14     
15 //    siganl的didSubscribe中调用[subscriber sendNext:@1];
16 //    sendNext底层其实就是执行subscriber的nextBlock

 Demo:

 1  RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
 2         // block调用时刻:每当有订阅者订阅信号,就会调用block。
 3         // 2.发送信号
 4         [subscriber sendNext:@1];
 5         // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
 6         [subscriber sendCompleted];
 7         
 8         return [RACDisposable disposableWithBlock:^{
 9             // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
10             // 执行完Block后,当前信号就不在被订阅了。
11             
12             NSLog(@"信号被销毁");
13             
14         }];
15     }];
16     
17     // 3.订阅信号,才会激活信号.
18     [siganl subscribeNext:^(id x) {
19         // block调用时刻:每当有信号发出数据,就会调用block.
20         NSLog(@"接收到数据:%@",x);
21     }];
View Code

打印结果:

2. RACSubscriber

表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。

3.RACDisposable

用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。 

  • 使用场景:不想监听某个信号时,可以通过它主动取消订阅信号。

4.RACSubject

RACSubject:信号提供者,自己可以充当信号,又能发送信号。

  • 使用场景:通常用来代替代理,有了它,就不必要定义代理了。

RACReplaySubject:重复提供信号类,RACSubject的子类。

  • RACReplaySubjectRACSubject区别:

    • RACReplaySubject可以先发送信号,在订阅信号,RACSubject就不可以。
  • 使用场景一:如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类。

  • 使用场景二:可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值。

https://www.jianshu.com/p/87ef6720a096

原文地址:https://www.cnblogs.com/EchoHG/p/8313844.html