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.2 didSubscribe,拿到订阅者调用sendNext,其实是调用RACSubjectsendNext

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

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

    

    

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

     解决:使用RACMulticastConnection就能解决.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值