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

Другие вопросы по тегам