ReactiveCocoa:如何防止 RACSignal 被并行执行两次?
ReactiveCocoa: How to prevent RACSignal from being executed twice in parallel?
在我的应用程序中,我将 ReactiveCocoa 和 AFNetworking-Extension 用于 API-Calls。
对于每个 API-端点,我都有一个启动 API-请求并返回 RACSignal 的方法。
根据 API-调用的结果,我主要填充了 UITableViews。
有多个事件,导致 Reloading/Refreshing 每个 API-请求的视图:
- 应用程序启动时
- viewDidAppear 在每个 Tab 中
- 当用户使用 PullToRefresh 时
- 当应用自行决定随时获取新数据时
如何防止新的 API- 请求在当前正在执行的同一端点请求完成之前执行?
我知道,我可以使用 "throttle" 来限制点击事件等用户输入。但正如已经提到的,有几种情况可以启动新的 API-Request。
我可以使用标志,这些标志在开始请求时设置,并将在 "completed" 块中重置。
但是 ReactiveCocoa 中有内置的方法可以代替吗?
正如@Jakub-Vanu 所说,RACCommand 是您的朋友。
您可以有一个 RACCommand,它 returns 一个将网络请求的结果作为 Next 事件发送的信号。
let apiFetchCommand: RACCommand = RACCommand(signalBlock: { [weak self](object: AnyObject!) -> RACSignal! in
return self.fetchSignal()
})
然后,如果您想要一个信号发送来自该命令的下一个事件,您可以在 RACCommand 上使用 executionSignals
属性。
let fetchedResultsSignal: RACSignal = self.apiFetchCommand.executionSignals.switchToLatest()
此信号可用于收听该命令的结果。
RACCommands 有一个名为 allowsConcurrentExecution
的 属性,默认为 false。这意味着如果 returns 尚未完成的信号,该命令将不会触发。
然后执行命令只需调用
self.apiFetchCommand.execute(someObject)
在我的应用程序中,我将 ReactiveCocoa 和 AFNetworking-Extension 用于 API-Calls。 对于每个 API-端点,我都有一个启动 API-请求并返回 RACSignal 的方法。
根据 API-调用的结果,我主要填充了 UITableViews。
有多个事件,导致 Reloading/Refreshing 每个 API-请求的视图:
- 应用程序启动时
- viewDidAppear 在每个 Tab 中
- 当用户使用 PullToRefresh 时
- 当应用自行决定随时获取新数据时
如何防止新的 API- 请求在当前正在执行的同一端点请求完成之前执行?
我知道,我可以使用 "throttle" 来限制点击事件等用户输入。但正如已经提到的,有几种情况可以启动新的 API-Request。
我可以使用标志,这些标志在开始请求时设置,并将在 "completed" 块中重置。
但是 ReactiveCocoa 中有内置的方法可以代替吗?
正如@Jakub-Vanu 所说,RACCommand 是您的朋友。
您可以有一个 RACCommand,它 returns 一个将网络请求的结果作为 Next 事件发送的信号。
let apiFetchCommand: RACCommand = RACCommand(signalBlock: { [weak self](object: AnyObject!) -> RACSignal! in
return self.fetchSignal()
})
然后,如果您想要一个信号发送来自该命令的下一个事件,您可以在 RACCommand 上使用 executionSignals
属性。
let fetchedResultsSignal: RACSignal = self.apiFetchCommand.executionSignals.switchToLatest()
此信号可用于收听该命令的结果。
RACCommands 有一个名为 allowsConcurrentExecution
的 属性,默认为 false。这意味着如果 returns 尚未完成的信号,该命令将不会触发。
然后执行命令只需调用
self.apiFetchCommand.execute(someObject)