Reactivecocoa忽略对函数的进一步调用,直到之前的调用完成为止

时间:2015-01-07 04:07:57

标签: ios reactive-cocoa

在我的反应可可中,如果先前对it的调用仍在进行,我想阻止对函数的调用。我已经实现了如下,但它似乎更像是一个黑客。

 __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信号,只执行一次,一旦完成,我重新创建信号。有没有更好的方法来实现上述目标?

2 个答案:

答案 0 :(得分:2)

在我看来,你应该使用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

答案 1 :(得分:-1)

来自waitUntilCompleted的方法RACSignal可以解决问题。