使用RxSwift,我会Observable.just(1)
发出1
然后发出完成。
您可以使用RAC2执行:[RACSignal return:@1]
如何使用RAC3做到这一点?
更清楚......我正在寻找一种方法来创建一个产生单个硬编码值的RAC3 Signal
。我该怎么办? (SignalProducer(value: 1)
不起作用。)
答案 0 :(得分:1)
在阅读讨论后,我认为Charlotte Tortorella的答案是正确的:您使用SignalProducer(value: 1
)达到了所需的行为。
我认为问题在于对Signal
和SignalProducer
的概念缺失了解。
As described here,ReactiveSwift中的Signal
是RAC 2.0中的热 RACSignal
或Rx中的Observable
,以及SignalProducer
在ReactiveSwift中,RAC 2.0中的冷 RACSignal
或Rx中的Observable
。这是故意偏离其他反应框架以及RAC< 3.0。
这意味着,您很可能拥有一个采用冷 RACSignal
或Observable
的方法,因为您希望为每个订阅者触发它。
因此,如果您要转换RAC 2.0代码(需要冷 Signal
或Observable
),则需要将其更改为{{1}在RAC中> = 3.0。
作为一个例子,在ObjC和RAC 2.0中采用这个例子:
SignalProducer
像这样调用此方法
-(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];
在Swift和ReactiveCocoa 5.0中,等效的实现看起来像这样
Next: 1
Completed
Next: 1
Completed
像这样打电话
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)
swift版本可能看起来有点笨重,但如果您只需要Next: 1
Completed
Next: 1
Completed
/ Next
个事件,它们看起来或多或少相同。请注意,您需要value
制作人,而不仅仅是start
信号。
总之:
你是对的,如果你期望observe
,也无法提供等价物。对于等效实现,您需要更改函数以获取Signal
。 SignalProducer
相当于冷 SignalProducer
,它会触发每个订阅者。
答案 1 :(得分:0)
RAC 3及更高版本使用构造函数。
SignalProducer(value: 1)