#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:] .
Другими словами, к сожалению, нет способа сделать то, что вы пытаетесь сделать. Если вам нужна возможность отменить поведение сигналов, создаваемых вашим параметром блока, рассмотрите возможность проверки этих сигналов на наличие некоторого условия.