使用 RxSwift,我会做Observable.just(1)
这将发射1
然后发射完成。
看起来你可以用 RAC2 做:[RACSignal return:@1]
我如何使用 RAC3 做到这一点?
更清楚地说......我正在寻找一种方法来创建Signal
产生单个硬编码值的 RAC3。我该怎么做?(SignalProducer(value: 1)
不是那样工作的。)
使用 RxSwift,我会做Observable.just(1)
这将发射1
然后发射完成。
看起来你可以用 RAC2 做:[RACSignal return:@1]
我如何使用 RAC3 做到这一点?
更清楚地说......我正在寻找一种方法来创建Signal
产生单个硬编码值的 RAC3。我该怎么做?(SignalProducer(value: 1)
不是那样工作的。)
阅读讨论后,我认为 Charlotte Tortorella 的回答是正确的:您使用SignalProducer(value: 1
) 实现了所需的行为。
我认为问题在于对什么Signal
和SignalProducer
是什么的理解失误。
如此处所述,Signal
ReactiveSwift 中的 a在 RAC 2.0 或Rx中是热 的,而 ReactiveSwift 中的 a 在RAC 2.0 或 Rx中是冷的。这是故意偏离其他响应式框架以及 RAC < 3.0。RACSignal
Observable
SignalProducer
RACSignal
Observable
这意味着,您很可能有一种方法会感冒 RACSignal
,或者Observable
因为您希望它为每个订阅者触发。
因此,如果您想转换您的 RAC 2.0 代码,即需要冷 Signal
或Observable
,您将需要将其更改为SignalProducer
在 RAC >= 3.0 中采用 a。
以 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
相当于为每个订阅者触发的感冒。 Signal
RAC 3 及更高版本使用构造函数。
SignalProducer(value: 1)