创建一个发出一个对象然后完成的信号?
Create a signal that emits one object then completes?
使用 RxSwift,我会做 Observable.just(1)
,它将发出 1
然后发出完成。
看起来你可以用 RAC2 做:[RACSignal return:@1]
如何使用 RAC3 做到这一点?
更清楚...我正在寻找一种创建 RAC3 Signal
的方法,该 RAC3 Signal
可生成单个硬编码值。我该怎么做? (SignalProducer(value: 1)
这样不行。)
RAC 3 及更高版本使用构造函数。
SignalProducer(value: 1)
阅读讨论后,我认为 Charlotte Tortorella 的回答是正确的:您通过 SignalProducer(value: 1
).
实现了所需的行为
我认为问题在于对 Signal
和 SignalProducer
是什么的误解。
As described here,ReactiveSwift 中的 Signal
是 RAC 2.0 中的 hot RACSignal
或 Observable
在 Rx 中,SignalProducer
在 ReactiveSwift 中是 cold RACSignal
在 RAC 2.0 中或 Observable
在 Rx 中。这是故意偏离其他反应式框架以及 RAC < 3.0。
这意味着,您很可能有一个采用 cold RACSignal
或 Observable
的方法,因为您希望它为每个订阅者触发。
因此,如果您想转换 RAC 2.0 代码,需要 cold 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
将为 each 订阅者触发。
使用 RxSwift,我会做 Observable.just(1)
,它将发出 1
然后发出完成。
看起来你可以用 RAC2 做:[RACSignal return:@1]
如何使用 RAC3 做到这一点?
更清楚...我正在寻找一种创建 RAC3 Signal
的方法,该 RAC3 Signal
可生成单个硬编码值。我该怎么做? (SignalProducer(value: 1)
这样不行。)
RAC 3 及更高版本使用构造函数。
SignalProducer(value: 1)
阅读讨论后,我认为 Charlotte Tortorella 的回答是正确的:您通过 SignalProducer(value: 1
).
我认为问题在于对 Signal
和 SignalProducer
是什么的误解。
As described here,ReactiveSwift 中的 Signal
是 RAC 2.0 中的 hot RACSignal
或 Observable
在 Rx 中,SignalProducer
在 ReactiveSwift 中是 cold RACSignal
在 RAC 2.0 中或 Observable
在 Rx 中。这是故意偏离其他反应式框架以及 RAC < 3.0。
这意味着,您很可能有一个采用 cold RACSignal
或 Observable
的方法,因为您希望它为每个订阅者触发。
因此,如果您想转换 RAC 2.0 代码,需要 cold 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
将为 each 订阅者触发。