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并用一个信号终止计时器
我想每 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并用一个信号终止计时器