1

使用 RxSwift,我会做Observable.just(1)这将发射1然后发射完成。

看起来你可以用 RAC2 做:[RACSignal return:@1]

我如何使用 RAC3 做到这一点?

更清楚地说......我正在寻找一种方法来创建Signal产生单个硬编码值的 RAC3。我该怎么做?(SignalProducer(value: 1)不是那样工作的。)

4

2 回答 2

1

阅读讨论后,我认为 Charlotte Tortorella 的回答是正确的:您使用SignalProducer(value: 1) 实现了所需的行为。

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

如此处所述SignalReactiveSwift 中的 a在 RAC 2.0 或Rx中是 的,而 ReactiveSwift 中的 a 在RAC 2.0 或 Rx中是的。这是故意偏离其他响应式框架以及 RAC < 3.0。RACSignalObservableSignalProducer RACSignalObservable

这意味着,您很可能有一种方法会感冒 RACSignal,或者Observable因为您希望它为每个订阅者触发。

因此,如果您想转换您的 RAC 2.0 代码,即需要 SignalObservable,您将需要将其更改为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

于 2016-11-29T11:10:09.787 回答
0

RAC 3 及更高版本使用构造函数。

SignalProducer(value: 1)

于 2016-08-27T23:33:09.467 回答