ReactiveCocoa(六) 之RACMulticastConnection使用

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

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

RACMulticastConnection使用步骤:

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

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

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

 4.连接 [connect connect]



 RACMulticastConnection底层原理:

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

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

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

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

 3.2 didSubscribe,拿到订阅者调用sendNext,其实是调用RACSubject的sendNext

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

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

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

 解决:使用RACMulticastConnection就能解决.
- (void)test // 普通写法, 这样的缺点是:没订阅一次信号就得重新创建并发送请求,这样很不友好
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
        // didSubscribeblock中的代码都统称为副作用。
        // 发送请求---比如afn
        NSLog(@"发送请求啦");
        // 发送信号
        [subscriber sendNext:@"ws"];
        return nil;
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];

}

- (void)test2 { // 比较好的做法。 使用RACMulticastConnection,无论有多少个订阅者,无论订阅多少次,我只发送一个。
    // 1.发送请求,用一个信号内包装,不管有多少个订阅者,只想发一次请求
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
        // 发送请求
        NSLog(@"发送请求啦");
        // 发送信号
        [subscriber sendNext:@"ws"];
        return nil;
    }];
    //2. 创建连接类
    RACMulticastConnection *connection = [signal publish];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    [connection.signal subscribeNext:^(id x) {
         NSLog(@"%@", x);
    }];
    [connection.signal subscribeNext:^(id x) {
         NSLog(@"%@", x);
    }];
    //3. 连接。只有连接了才会把信号源变为热信号
    [connection connect];
}

你可能感兴趣的:(ReactiveCocoa(六) 之RACMulticastConnection使用)