RACCommand — удаление исполняемого сигнала

#ios #objective-c #reactive-cocoa

#iOS #objective-c #реактивный-какао

Вопрос:

Я немного запутался в механизме утилизации RACCommand . Я хочу избавиться от подписки на выполнение сигнала вручную, но disposableBlock вызывается только после sendCompleted события. Это проблема моей реальной задачи, надеюсь, кто-нибудь сможет мне помочь.

 - (void)test {
    RACCommand *rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        return [self signal];
    }];

    RACDisposable *rac_dispose = [[rac_command execute:nil] subscribeNext:^(id x) {}];
    [rac_dispose dispose];
}

- (RACSignal *)signal {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [subscriber sendNext:nil];
            [subscriber sendCompleted];
        });
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"dispose block");
        }];
    }];
}
  

Ответ №1:

Подписки на сигналы, которые создает ваш параметр block (для инициализатора), являются частными для RACCommand, и он не предлагает API для удаления этих подписок. RACCommand будет поддерживать эту подписку до ее завершения, независимо от того, удаляете ли вы сигнал, возвращенный из -[RACCommand execute:] .

Другими словами, к сожалению, нет способа сделать то, что вы пытаетесь сделать. Если вам нужна возможность отменить поведение сигналов, создаваемых вашим параметром блока, рассмотрите возможность проверки этих сигналов на наличие некоторого условия.