ReactiveCocoa之RACMulticastConnection使用(六)

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa之RACMulticastConnection使用(六)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.RACMulticastConnection:用于当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。

2.使用注意:RACMulticastConnection通过RACSignal的-publish或者-muticast:方法创建.


RACMulticastConnection使用步骤:

1.创建信号+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe

2.创建连接RACMulticastConnection *connect = [signal publish];

3.订阅信号,注意:订阅的不在是之前的信号,而是连接的信号。[connect.signal subscribeNext:nextBlock]

4.连接[connect connect]

RACMulticastConnection底层原理:

1.创建connectconnect.sourceSignal -> RACSignal(原始信号) connect.signal -> RACSubject

2.订阅connect.signal,会调用RACSubjectsubscribeNext,创建订阅者,而且把订阅者保存起来,不会执行block

3.[connect connect]内部会订阅RACSignal(原始信号),并且订阅者是RACSubject

3.1.订阅原始信号,就会调用原始信号中的didSubscribe

3.2didSubscribe,拿到订阅调用sendNext,其实是调用RACSubjectsendNext

4.RACSubjectsendNext,会遍历RACSubject所有订阅者发送信号。

4.1因为刚刚第二步,都是在订阅RACSubject,因此会拿到第二步所有的订阅者,调用他们的nextBlock

需求:假设在一个信号中发送请求,每次订阅一次都会发送请求,这样就会导致多次请求。

解决:使用RACMulticastConnection就能解决.

[objc] view plain copy
  1. -(void)test//普通写法,这样的缺点是:没订阅一次信号就得重新创建并发送请求,这样很不友好
  2. {
  3. RACSignal*signal=[RACSignalcreateSignal:^RACDisposable*(id<RACSubscriber>subscriber){
  4. //didSubscribeblock中的代码都统称为副作用。
  5. //发送请求---比如afn
  6. NSLog(@"发送请求啦");
  7. //发送信号
  8. [subscribersendNext:@"ws"];
  9. returnnil;
  10. }];
  11. [signalsubscribeNext:^(idx){
  12. NSLog(@"%@",x);
  13. }];
  14. [signalidx){
  15. NSLog(@"%@",x);
  16. }
  17. -(void)test2{//比较好的做法。使用RACMulticastConnection,无论有多少个订阅者,无论订阅多少次,我只发送一个。
  18. //1.发送请求,用一个信号内包装,不管有多少个订阅者,只想发一次请求
  19. //发送请求
  20. NSLog(@"发送请求啦");
  21. //发送信号
  22. [subscribersendNext:@"ws"];
  23. nil;
  24. //2.创建连接类
  25. RACMulticastConnection*connection=[signalpublish];
  26. [connection.signal [connection.signal//3.连接。只有连接了才会把信号源变为热信号
  27. [connectionconnect];
  28. }

猜你在找的React相关文章