0

我想使用 Reactive Cocoa 4 从 API 每 15 秒刷新一次数据。由于多个订阅者可以同时请求这些数据,我希望多个订阅者共享一个数据源。

我目前的方法是拥有一个Signal并将其共享给每个需要数据的实例。此信号应在第一个信号被订阅后立即开始刷新,并在最后一个信号被释放后结束。

SignalProducer<String, NoError> { observer, disposable in
    self.disposable = self.repeatTimer.observeNext { _ in
        NSLog("start network request")
            observer.sendNext("result")
        }
        }.on(disposed: {
            NSLog("disposed")
        }).startWithSignal { signal, disposable1 in
            self.updateSignal = signal
        }
    }

    return (updateSignal, disposable!)

因此,对于第一个请求,我创建并存储了 updateSignal,随后的每个请求都将获得该信号。

我的第一个问题:我怎么知道最后一个订阅者何时释放了它的信号?那么我什么时候可以停止请求?

我的第二个问题:我存储来自我的重复网络请求的一次性用品,self.disposable我也将其返回给订阅者。如果订户只处理其信号(他从中获得Signal.observeNext())内部循环,我记录“启动网络请求”的地方将无休止地运行。即使外部信号被处理,我是否真的需要自己停止该信号?

共享重复请求是否有更好的方式或模式?

4

1 回答 1

1

使用全局计时器功能以指定的时间间隔执行工作。

你可以这样做:

self.disposable = 
    timer(SomeTimeInterval onScheduler:QueueScheduler.mainQueueScheduler)
    .startWithNext { _ in
         //start network request here
    }

但是如果你链接你的网络请求生产者并观察结果会更好,如下所示:

self.disposable =
    timer(SomeTimeInterval onScheduler:QueueScheduler.mainQueueScheduler)
    .flatMap(.Latest, transform { _ in 
         return self.networkRequestSignalProducer()
    })
    .start({ event in 
         //monitor the result of the network request
    })

请注意,您可能不想像我在此示例中那样使用主队列,具体取决于您实现网络请求的方式。

如果您想避免处理一次性用品,可以在 .flatMap 之前添加 .takeUntil 并使用信号终止计时器

于 2016-02-01T01:40:59.890 回答