Reactivecocoa игнорирует дальнейшие вызовы функции, пока предыдущий вызов не завершится.

В моем реактивном какао я хочу заблокировать вызовы функции, если предыдущий вызов все еще выполняется. Я добился этого следующим образом, но это больше похоже на взлом.

 __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, который выполняется только один раз, и после его завершения я воссоздаю сигнал. Есть ли лучший способ выполнить вышеизложенное?


person Pooja Bansiya    schedule 07.01.2015    source источник


Ответы (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];

вот статья в блоге о RACCommands

person kamidude    schedule 23.01.2015

Метод waitUntilCompleted из RACSignal может помочь.

person user4439795    schedule 10.01.2015