如何从ReactiveCocoa信号中获取当前值?

时间:2013-06-19 20:25:24

标签: ios reactive-programming reactive-cocoa

我有信号返回NSNumber:

RACSignal *signal = ....

然后在某些代码处我希望在执行的那一刻得到信号的价值, 类似的东西:

NSNumber *value = [code that extracts current value of signal];

3 个答案:

答案 0 :(得分:6)

信号没有“当前”值的概念。价值被发送,然后消失 - 它们非常短暂(除非使用重播主题或其他技巧)。

您可能想要订阅该信号。请查看Framework Overviewexamples in the README以获得更深入的解释。

答案 1 :(得分:2)

  1. 来自ReactiveCocoa信号的“当前值”,使用Reactive语言 - 对此信号订阅
  2. -subscribe...方法可让您访问信号中的当前和未来值:

        [signal subscribeNext:^(id x) {
            NSLog(@"Current value = %@", x);
        }];
    
    1. 另一种方式:如果您想将此值与其他值一起使用 - 请使用combineLatest:reduce:方法,如下所示:

      RACSignal *calculationWithCurrentValueSignal =
        [RACSignal combineLatest:@[signalWithCurrentValueThatNeeded, anotherSignal]
                          reduce:^id(NSNumber *myCurrentValue, NSNumber *valueFromAnotherSignal) {
                             //do your calculations with this values..
                            return newValue;
                          }];
      

答案 2 :(得分:1)

是对Swift版本有效的答案吗?

想象一下SignalPipe观察对象属性的变化。订阅来自其他几个对象的信号,即queue.queueCountSignal.observeNext({...})时,将在下次属性更改时执行观察块。有没有办法要求当前值或触发observeNextBlock?

我不想使用SignalProducer(可以显式启动),因为这意味着我需要从需要信号的每个对象收集observeNext块。我也不想为同一件事创建几个信号生成器 - 或者这实际上是否需要?

以下是更清晰的示例代码

import ReactiveCocoa

class SwipingQueueWithSignals<T> : SwipingQueue<T> {

    override var count: Int {
        didSet(oldQueueCount) {
            let newQueueCount = self.count
            queueCountSignalObserver.sendNext(newQueueCount)
    }

    let queueCountSignal: Signal<Int, NoError>
    private let queueCountSignalObserver: Observer<Int, NoError>

    init() {
        (self.queueCountSignal, self.queueCountSignalObserver) = Signal<Int, NoError>.pipe()
        super.init()
    }
}

// Something like this 
queue.queueCountSignal.
    .observeNext { next in print(next) }
    .lookupCurrentValueNow()