通过调用-subscribeCompleted:
,ReactiveCocoa可以将信号转换为“热”信号。但是,如果您不关心结果(即没有订阅者),我认为这种方法相当冗长。
RACDisposable *animationDisposable = [[self play:animation] subscribeCompleted:^{
// just to make the animation play
}];
这3行字并不足以表达我的意图。
有没有类似目的的方法呢?谢谢!
通过调用-subscribeCompleted:
,ReactiveCocoa可以将信号转换为“热”信号。但是,如果您不关心结果(即没有订阅者),我认为这种方法相当冗长。
RACDisposable *animationDisposable = [[self play:animation] subscribeCompleted:^{
// just to make the animation play
}];
这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`.
如果您不关心信号的输出(并且出于某些原因,您真的希望play成为一个信号),那么您可能需要创建一个命令。命令通过某种事件(例如UI按钮按下或其他事件)执行信号。只需创建信号,将其添加到命令中,然后在需要运行它时执行即可。
@weakify(self);
RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^(id input) {
@strongify(self);
return [self play:animation];
}];
//This causes the signal to be ran
[command execute:nil];
//Or you could assign the command to a button so it is executed
// when the button is pressed
playButton.rac_command = command;