ios - Reactivecocoa 忽略对函数的进一步调用,直到上一次调用完成

标签 ios reactive-cocoa

在我的 reactive cocoa 中,如果之前对它的调用仍在进行,我想阻止对函数的调用。我已经按如下方式实现了这一点,但它看起来更像是一个 hack。

 __block RACSignal * performSync = [[self performSync:connectionClient] take:1];

[[[self rac_signalForSelector:@selector(forceSync:)]]]
   flattenMap:^RACStream *(id value) {
       NSLog(kMILogLevelDebug, @"Perform sync requested");
       return performSync;
   }]
   subscribeNext:^(id x) {
      NSLog(kMILogLevelDebug,@"Sync is performed", [NSDate date]);
   }
   error:^(NSError *error) {
       [self performSyncCompleted:error];
   }
   completed:^{
       [self performSyncCompleted:nil];
       performSync = [[self performSync:connectionClient] take:1];

   }];

因此,我创建了一个只执行一次的 performSync 信号,一旦完成,我就重新创建该信号。有更好的方法来完成上述任务吗?

最佳答案

我认为您应该使用 RACCommand:

RACCommand* command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
    return [#mysignal];
}];
// then later
[command execute:nil];
// or
[[command execute:nil] take:1];// synchronous but be careful ! here be dragons

您可以根据需要多次调用 execute,一次不会多次订阅信号。它在默认设置中广泛使用多播信号。

此外,您可以通过以下方式知道命令是否正在执行:

[command executing];

here is a blog article talking about RACCommands

关于ios - Reactivecocoa 忽略对函数的进一步调用,直到上一次调用完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27812258/

相关文章:

ios - 如何正确使用 NSTimer 来创建自动幻灯片放映

swift - 将 swift 属性的值绑定(bind)到 viewModel 的属性

ios - ReactiveCocoa 条件异步信号

ios - 如何解决分配字符串值时的内存泄漏

iOS 7 导航栏在 viewDidAppear 上跳跃/拉伸(stretch)

ios - 在 Swift 的 iPad 中没有选择任何内容时设置默认的详细 View Controller (在 Split View Controller 中)?

ios - 如何使用 Objective-C 绑定(bind) ReactiveCocoa 中的结构

swift - 信号 : Collect values over time interval

objective-c - Reactive Cocoa 中 RACAble()、RACObserve() 和 RACBind() 的区别

ios - 在不播放视频的情况下存储 AVURLAsset 的 ckc key 数据