Reactive cocoa 如何使用ReactiveCocoa生成互斥信号

Reactive cocoa 如何使用ReactiveCocoa生成互斥信号,reactive-cocoa,Reactive Cocoa,我有一个视图控制器,它有两个信号。一个是下拉刷新信号,另一个是上拉加载更多信号。有两种常见的场景: 如果下拉信号正在运行,则不应触发新的下拉信号和上拉信号 如果上拉信号正在运行,则不应触发新的上推信号和下拉信号 参考文件,我发现switchToLatest操作员可以禁止同一信号同时运行。但是它并不完美,因为switchToLatest是在旧信号未完成时启动一个新信号,然后将新信号的下一个发送给用户。我想要的是,如果一个信号正在运行,新的信号不应该触发 在没有RAC的世界中,我必须保持孤岛状态;在

我有一个视图控制器,它有两个信号。一个是下拉刷新信号,另一个是上拉加载更多信号。有两种常见的场景:

  • 如果下拉信号正在运行,则不应触发新的下拉信号和上拉信号
  • 如果上拉信号正在运行,则不应触发新的上推信号和下拉信号
  • 参考文件,我发现switchToLatest操作员可以禁止同一信号同时运行。但是它并不完美,因为switchToLatest是在旧信号未完成时启动一个新信号,然后将新信号的下一个发送给用户。我想要的是,如果一个信号正在运行,新的信号不应该触发

    在没有RAC的世界中,我必须保持孤岛状态;在触发下拉或上拉信号之前,我将检查isLoading并确定应触发信号


    RAC世界中有什么优雅的方法可以删除isLoading状态吗?

    通常,您需要在信号中发送这些状态更改。

    尝试使用
    RACSubject
    更改每个单独进程的状态(上拉和下拉)。他们中的每一个人都应该订阅对方和自己的
    RACSubject
    信号,并在新的触发呼叫期间应用以下操作员:

    - (RACSignal *)combineLatestWith:(RACSignal *)signal;
    
    大概是这样的:

    RACSubject *pullUpStateChanged = [RACSubject subject];
    RACSubject *pullDownStateChanged = [RACSubject subject];
    
    RACSignal *stateChangeTrigger = [pullUpStateChanged combineLatestWith:pullDownStateChanged]
    [stateChangeTrigger
      filter:^BOOL(RACTuple *tuple) {
          /// second item should contains tuple with 2 states
          /// based on this value you can reject some of the flows
    
      }] 
     flattenMap:^RACStream *(id value) {
    
    }];
    
    一个通知:
    当每个信号至少触发一次时,combineLatestWith:
    将开始工作。这就是为什么发送初始状态
    @NO
    (或其他值)。否则,您可以使用真正的触发器

    p.S.我没有在Xcode中验证和构建提供的代码

    更新:您只需通过相应的
    RACSubject
    上的
    sendNext:
    将您的上拉和下拉
    RACSignal的
    数据转发给受试者即可。在这里使用主题的开销很小,但您需要在两个信号都已触发的状态之前开始工作(CombineRelatestWith:不幸的是,若两个信号都未就绪,则不会触发)。这就是为什么需要使用RACSubjects作为真实触发器和实际操作之间的中介


    更新2:事实上,这是一个有趣的挑战,我已经尝试过实现这种功能。我面临一个问题。在使用CombineRelatestWith:时,您将被迫不仅从实际触发器获取更新,而且从相反的触发器获取更新。您需要区分具有某些ID的更改请求。我已经放置了完整的实现

    您是否考虑使用
    RACCommand
    ?someTrigger是UI的下拉或上拉操作?@YueLiu,请查看更新和更新2