创建一个发出一个对象然后完成的信号?

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).

实现了所需的行为

我认为问题在于对 SignalSignalProducer 是什么的误解。

As described here,ReactiveSwift 中的 Signal 是 RAC 2.0 中的 hot RACSignalObservable 在 Rx 中,SignalProducer 在 ReactiveSwift 中是 cold RACSignal 在 RAC 2.0 中或 Observable 在 Rx 中。这是故意偏离其他反应式框架以及 RAC < 3.0。

这意味着,您很可能有一个采用 cold RACSignalObservable 的方法,因为您希望它为每个订阅者触发。

因此,如果您想转换 RAC 2.0 代码,需要 cold SignalObservable,您需要更改它以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,则无法提供等效项。对于等效的实现,您需要将函数更改为采用 SignalProducerSignalProducer 相当于 cold Signal 将为 each 订阅者触发。