首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用ReactiveCocoa制作互斥信号

如何利用ReactiveCocoa制作互斥信号
EN

Stack Overflow用户
提问于 2015-10-13 15:22:30
回答 1查看 120关注 0票数 1

我有一个视图控制器,它有两个信号。一个是向下拉以刷新信号,另一个是拉起加载更多的信号。有两个共同的场景:

  1. 如果拉下信号正在运行,则新的拉下信号和拉出信号不应触发。
  2. 如果拉起信号正在运行,则新的升压信号和下拉信号不应触发。

参考文档,我发现switchToLatest操作符可以禁止同一信号同时运行。然而,它并不完美,因为switchToLatest是在旧信号尚未完成时启动一个新信号,并将新信号的旁边发送给用户。我想要的是,如果一个信号运行,新的信号不应该触发。

在无RAC世界中,我必须保持一个isLoading状态;在触发下拉或拔出信号之前,我将检查isLoading并确定该信号应该被触发。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-16 10:18:40

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

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

代码语言:javascript
复制
- (RACSignal *)combineLatestWith:(RACSignal *)signal;

就像这样:

代码语言:javascript
复制
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) {

}];

One通知:当每个信号至少发射一次时, combineLatestWith:将开始工作。这就是为什么发送初始状态@NO (或其他值)。否则你可以用真正的触发器代替。

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

更新:您需要的一切,将pullUp和pullDown RACSignal's数据通过适当的RACSubject上的sendNext:转发给受试者。在这里使用这些主题有点开销,但是您需要在两个信号都触发的状态之前开始工作(combineLatestWith:不幸的是,如果这两个信号都没有准备好,就不会启动)。这就是为什么您需要使用RACSubjects作为实际触发器和实际操作之间的中介。

UPDATE2:,实际上,这是一个有趣的挑战,我尝试过实现这类东西。我面临过一个问题。在使用combineLatestWith时:您将被迫不仅从实际触发器获得更新,而且还要使用相反的触发器。您需要用一些ID来区分更改请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33106548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档