Reactive 中重复网络请求的管道 Cocoa 4

Pipe for repeating network requests in Reactive Cocoa 4

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

我目前的方法是拥有一个 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,随后的每个请求都将获得该信号。

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

我的第二个问题:我将 repeatin 网络请求中的一次性物品存储在 self.disposable 中,我也将其 return 给订阅者。如果订户仅处理其信号(他从 Signal.observeNext() 获得),则我记录 "start network request" 的内部循环是 运行 无休止的。即使外部 Signal 被处理掉,我真的需要自己停止那个 Signal 吗?

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

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

你可以这样做:

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
    })

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

如果你想避免处理disposables,你可以在.flatMap之前添加一个.takeUntil并用一个信号终止计时器