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

时间:2016-08-26 17:02:30

标签: reactive-cocoa reactive-cocoa-3

使用RxSwift,我会Observable.just(1)发出1然后发出完成。

您可以使用RAC2执行:[RACSignal return:@1]

如何使用RAC3做到这一点?

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

2 个答案:

答案 0 :(得分:1)

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

我认为问题在于对SignalSignalProducer的概念缺失了解。

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

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

因此,如果您要转换RAC 2.0代码(需要 SignalObservable),则需要将其更改为{{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,也无法提供等价物。对于等效实现,您需要更改函数以获取SignalSignalProducer相当于 SignalProducer,它会触发每个订阅者。

答案 1 :(得分:0)

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

SignalProducer(value: 1)