我有信号返回NSNumber:
RACSignal *signal = ....
然后在某些代码处我希望在执行的那一刻得到信号的价值, 类似的东西:
NSNumber *value = [code that extracts current value of signal];
答案 0 :(得分:6)
信号没有“当前”值的概念。价值被发送,然后消失 - 它们非常短暂(除非使用重播主题或其他技巧)。
您可能想要订阅该信号。请查看Framework Overview和examples in the README以获得更深入的解释。
答案 1 :(得分:2)
-subscribe...
方法可让您访问信号中的当前和未来值:
[signal subscribeNext:^(id x) {
NSLog(@"Current value = %@", x);
}];
另一种方式:如果您想将此值与其他值一起使用 - 请使用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()