如何使RACSignal变热?

HKT*_*Lee 5 macos objective-c reactive-programming ios reactive-cocoa

ReactiveCocoa可以通过调用它将信号转换为"热"信号-subscribeCompleted:.但我认为如果你不关心结果(即没有订阅者),这种方法就相当冗长.

RACDisposable *animationDisposable = [[self play:animation] subscribeCompleted:^{
    // just to make the animation play
}];
Run Code Online (Sandbox Code Playgroud)

而这三行并不足以表达我的意图.

有类似目的的方法吗?谢谢!

eri*_*ice 5

我想做什么,除了让它变热(=让它运行一次).

"你继续使用这个词.我认为这并不意味着你的意思."

"热信号"是不管发送值(可能不工作)的是否有任何订户的信号.一个"冷信号"是推迟其工作和任何值的发送,直到它有一个用户的信号.冷信号将执行其工作并为每个订户发送值.

如果您想让冷信号只运行一次但有多个用户,则需要对信号进行多播.多播是一个非常简单的概念,其工作原理如下:

  1. 创建一个RACSubject来代理您要执行一次的信号发送的值.
  2. 根据需要多次订阅主题.
  3. 只对您想要执行一次的信号创建一个订阅,并且对于信号发送的每个值,将其发送给主题[subject sendNext:value].

但是,您可以而且应该使用RACMulticastConnection更少的代码来完成上述所有操作:

RACMulticastConnection *connection = [signal publish];
[connection.signal subscribe:subscriberA];
[connection.signal subscribe:subscriberB];
[connection.signal subscribe:subscriberC];
[connection connect]; // This will cause the original signal to execute once.
                      // But each of subscriberA, subscriberB, and subscriberC
                      // will be sent the values from `signal`.
Run Code Online (Sandbox Code Playgroud)

  • @ onmyway133最常见的冷信号示例是订阅时执行HTTP请求的示例.对于每个订户,进行单独的独立请求,并且每个订户获得其自己的响应.它很冷,因为在有订阅者之前,它实际上并没有"做"任何事情.热信号的一个示例是不断递送当前鼠标X,Y坐标的信号.无论有多少订户,每当发送新值时,所有订户都会被发送相同的值.只要没有订阅者,就会"错过"(或丢弃)值. (2认同)