欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

ReactiveCocoa(上)

程序员文章站 2022-03-08 15:22:06
ReactiveCocoa常见类 1. RAC中最核心的类RACSiganl: RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据 解析: 信号类(RACSiganl),只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交 ......

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:

ReactiveCocoa(上)
 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

打印结果:

ReactiveCocoa(上)

 

 

2. RACSubscriber

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

 

3.RACDisposable

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

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

 

4.RACSubject

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

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

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

  • RACReplaySubjectRACSubject区别:

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

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

 

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