【问题标题】:Create a signal that emits one object then completes?创建一个发出一个对象然后完成的信号?
【发布时间】:2017-01-03 10:11:38
【问题描述】:

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

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

如何使用 RAC3 做到这一点?

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

【问题讨论】:

    标签: reactive-cocoa reactive-cocoa-3


    【解决方案1】:

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

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

    As described hereSignal 在 ReactiveSwift 中是 hot RACSignal 在 RAC 2.0 或 Observable 在 Rx 中,SignalProducer 在 ReactiveSwift 中是 cold RAC 2.0 中的 RACSignal 或 Rx 中的 Observable。这是故意偏离其他响应式框架以及 RAC

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

    因此,如果您想转换您的 RAC 2.0 代码,即需要 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,它将为 每个 订阅者触发。

    【讨论】:

      【解决方案2】:

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

      SignalProducer(value: 1)

      【讨论】:

      • 但是如何将它传递给接受信号的函数?
      • 你没有。信号会立即触发,所以当你的函数检查你传入的信号时,它就会完成并且值会丢失。
      • 所以它不等同于我给出的 RxSwift 和 RAC2 示例,它们将为每个订阅者触发一次。有没有办法做到这一点?
      • 是的,SignalProducers 会为每个订阅者触发一次。信号没有。我的回答和你的例子一样。
      • 但是您不能将它传递给需要信号的函数吗?在这种情况下,您的答案是不等价的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多