Я просто подумал, что технически успешное завершение - это просто изменение состояния выполнения на НЕТ после того, как -executionSingals
отправил значение хотя бы один раз и не было ошибки после того, как состояние выполнения изменилось на ДА в последний раз.
На основе таких мыслей я сделал категорию:
#import "RACCommand+ARLCompletedSignal.h"
@implementation RACCommand (ARLCompletedSignal)
- (RACSignal *)completed
{
RACSignal *executing = self.executing;
RACSignal *signals = self.executionSignals;
RACSignal *errors = self.errors;
RACSignal *startingExecution = [RACSignal combineLatest:@[executing, [signals take:1]]
reduce:^id(NSNumber *executing, id _){ return executing; }];
return [[startingExecution
ignore:@NO]
flattenMap:^RACStream *(id value) {
RACSignal *comletedOrFailed = [[executing ignore:@YES] subscribeOn:[RACScheduler scheduler]];
return [[[comletedOrFailed take:1] takeUntil:errors] map:^id(id value) { return nil; }];
}];
}
@end
Заголовок:
@interface RACCommand (ARLCompletedSignal)
@property (nonatomic, readonly) RACSignal *completed;
@end
Здесь -comleted
отправляет nil, когда команда успешно завершает свою работу. Также на https://gist.github.com/slabko/546de430a16994a5da8e вы можете найти версию, который отправляет YES, если операция завершается успешно, или NO, если нет.
Я попробовал это в некоторых довольно простых случаях, и это сработало. Пожалуйста, дайте мне знать, если это не работает для вас.
Однако я считаю, что в большинстве случаев подписка на завершение исходного сигнала до того, как вы передадите его команде, является лучшим, «бесхитростным» вариантом.
person
Slabko
schedule
14.02.2015