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