Если RACSignal отправляет следующий, могу ли я обернуть его во что-то, что вместо этого отправляет завершенный?
Очень простой вопрос, и я, вероятно, наблюдаю за ключевым методом в RAC.
Скажи, что у меня есть этот простой сигнал
RACSignal *signal = [[RACSignal return:@"hello"] delay:10]
Как я могу без изменения вышеуказанного кода создать новый сигнал, который отправляет completed
когда любое значение передается (в этом случае @"hello"
после 10 seconds
)?
2 ответа
Решение
Некоторые альтернативы
RACSignal *completeSignal = [[signal take:1] ignoreValues];
RACSignal *completeSignal = [signal flattenMap:^(id value) {
return [RACSignal empty];
}];
RACSignal *completeSignal = [signal flattenMap:^(id value) {
return nil;
}];
Вы также можете просто использовать -take:
с параметром 1
:
RACSignal *originalSignal = [[RACSignal return:@"hello"] delay:10];
RACSignal *completesOnFirstValue = [originalSignal take:1];
Если вы не хотите, чтобы сигнал отправлял значение до его завершения, вы можете использовать -flattenMap:
как в вашем ответе, или вы можете использовать -takeUntil:
:
RACSignal *completesBeforeFirstValue = [originalSignal takeUntil:originalSignal];
(The -takeUntil:
оператор вызовет завершение сигнала, когда сработает триггерный сигнал до того, как значение будет доставлено.)