是否有像发布一样的ReactiveCocoa方法,但是它会将最新值转发给新订阅者?

时间:2014-02-13 20:43:11

标签: reactive-cocoa

我经常使用ReactiveCocoa来跟踪某个变量的最新值,例如文本字段中的文本。有时,这些最新值实际上是以多个订阅导致计算多次发生的方式自行计算的。通常,合并这些计算会显着显着

我想使用的是RACSignal* sharedComputationLatest = complicatedLatestValue.publish.autoconnect,但是当新订阅者订阅共享计算信号时,他们不会被告知最新值。

是否存在publish的某种变体,某种publishLatest已经存在并且能够满足我的需求?如果没有,它是否已经存在且在.Net的Rx中有一个名字?

更新:事实证明autoconnect的语义与我想象的略有不同,即如果订阅者数量变为零然后备份则没有重新连接。我需要重新连接位,所以我实现了自己的方法(在下面的答案中)。

2 个答案:

答案 0 :(得分:4)

听起来像你想要-replayLast

答案 1 :(得分:1)

这是一个自定义实现(注意:不是线程安全的):

-(RACSignal*) publishLatestAutoreconnect {
    __block int32_t subscriberCount = 0;
    __block RACDisposable* subscription = nil;
    __block RACReplaySubject* publishSubject = nil;

    return [RACSignal createSignal:^RACDisposable*(id<RACSubscriber> subscriber) {
        __block RACDisposable* _subscriberDisposable = nil;

        // auto[re]connect if we had no subscribers
        subscriberCount++;
        if (subscriberCount == 1) {
            publishSubject = [RACReplaySubject replaySubjectWithCapacity:1];
            subscription = [self subscribe:publishSubject];
        }

        // forward to subscriber
        _subscriberDisposable = [publishSubject subscribe:subscriber];

        return [RACDisposable disposableWithBlock:^{
            // stop forwarding to subscriber
            [_subscriberDisposable dispose];

            // disconnect if we now have no subscribers
            subscriberCount--;
            if (subscriberCount == 0) {
                [subscription dispose];
                subscription = nil;
                publishSubject = nil;
            }
        }];
    }];
}