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-请求的视图:

如何防止新的 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)