当有多个订阅者,但是我们只想发送一个信号的时候怎么办?这时我们就可以用RACMulticastConnection,来实现。代码示例如下
// 1.发送请求,用一个信号内包装,不管有多少个订阅者,只想发一次请求
self.single = [RACSignal createSignal:^RACDisposable *(id subscriber) {
// 发送请求
NSLog(@"发送请求啦");
@strongify(self);
self.count2++;
// 发送信号
[subscribersendNext:[NSStringstringWithFormat:@"connection-消息只需要发送一次请求即可%ld",(long)self.count2]];
returnnil;
}];
//2. 创建连接类
RACMulticastConnection *connection = [self.single publish];
[connection.signalsubscribeNext:^(idx) {
NSLog(@"%@", x);
}];
[connection.signalsubscribeNext:^(idx) {
NSLog(@"%@", x);
}];
[connection.signalsubscribeNext:^(idx) {
NSLog(@"%@", x);
}];
//3. 连接。只有连接了才会把信号源变为热信号
[connectionconnect];
log打印:
************************************************************************************
2018-08-14 16:39:49.783683+0800 RACDemo[2596:73190] 发送请求啦
2018-08-14 16:39:49.783996+0800 RACDemo[2596:73190] connection-消息只需要发送一次请求即可1
2018-08-14 16:39:49.784373+0800 RACDemo[2596:73190] connection-消息只需要发送一次请求即可1
2018-08-14 16:39:49.784623+0800 RACDemo[2596:73190] connection-消息只需要发送一次请求即可1
普通做法,代码如下:
@weakify(self);
// 普通写法, 这样的缺点是:没订阅一次信号就得重新创建并发送请求,这样很不友好
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
// didSubscribeblock中的代码都统称为副作用。
// 发送请求---比如afn
@strongify(self);
self.count1++;
NSLog(@"发送请求啦");
// 发送信号
[subscribersendNext:[NSStringstringWithFormat:@"connection-消息请求%ld次",(long)self.count1]];
returnnil;
}];
[signalsubscribeNext:^(idx) {
NSLog(@"%@", x);
}];
[signalsubscribeNext:^(idx) {
NSLog(@"%@", x);
}];
[signalsubscribeNext:^(idx) {
NSLog(@"%@", x);
}];
需要订阅三次,打印如下:
2018-08-14 16:39:43.814304+0800 RACDemo[2596:73190] 发送请求啦
2018-08-14 16:39:43.814576+0800 RACDemo[2596:73190] connection-消息请求1次
2018-08-14 16:39:43.814811+0800 RACDemo[2596:73190] 发送请求啦
2018-08-14 16:39:43.814991+0800 RACDemo[2596:73190] connection-消息请求2次
2018-08-14 16:39:43.816049+0800 RACDemo[2596:73190] 发送请求啦
2018-08-14 16:39:43.816599+0800 RACDemo[2596:73190] connection-消息请求3次
************************************************************************************