cold RAC 2.0 中的 RACSignal 或 Rx 中的 Observable。这是故意偏离其他响应式框架以及 RAC
这意味着,您很可能有一个采用 cold RACSignal 或 Observable 的方法,因为您希望它为每个订阅者触发。
因此,如果您想转换您的 RAC 2.0 代码,即需要 冷 Signal 或 Observable,您需要将其更改为在 RAC >= 3.0 中采用 SignalProducer .
以 ObjC 和 RAC 2.0 中的这个例子为例:
-(void)observeSignal:(RACSignal *)signal
{
[signal subscribeNext:^(NSNumber *x) {
NSLog(@"Next: %@", x);
} completed:^{
NSLog(@"Completed");
}];
}
这样调用这个方法
RACSignal *signal = [RACSignal return:@(1)];
[self observeSignal:signal];
[self observeSignal:signal];
(两次用于说明每个订阅的行为)将打印
Next: 1
Completed
Next: 1
Completed
在 Swift 和 ReactiveCocoa 5.0 中,等效实现可能如下所示
func observe(produer: SignalProducer<Int, NoError>) {
produer.start { event in
switch event {
case .value(let value):
print("Next: \(value)")
case .completed:
print("Completed")
default:
break
}
}
}
这样称呼
let producer = SignalProducer<Int, NoError>(value: 1)
observe(produer: producer)
observe(produer: producer)
它产生相同的输出
Next: 1
Completed
Next: 1
Completed
swift 版本可能看起来有点笨重,但如果您只需要 Next/value 事件,它们看起来或多或少相同。请注意,您需要start 生产者,而不仅仅是observe 信号。
总之:
您是对的,如果您期望 Signal,则无法提供等价物。对于等效实现,您需要将函数更改为采用SignalProducer。 SignalProducer 等效于 cold Signal,它将为 每个 订阅者触发。