5

我有返回 NSNumber 的信号:

RACSignal *signal = ....

然后在代码的某个地方,我想在执行时获取信号的值,例如:

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

3 回答 3

6

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

您可能想订阅该信号。查看框架概述自述文件中的示例以获得更深入的解释。

于 2013-06-19T20:30:24.723 回答
2
  1. 您使用 Reactive语言的“来自 ReactiveCocoa 信号的当前值” - 是对该信号的订阅。

这些-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;
                        }];
    
于 2014-06-05T14:07:49.200 回答
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()
于 2016-02-10T08:53:23.933 回答