ReactiveCocoa takeUntil: не отправлять завершение?

Я делаю некоторые основные цепочки сигналов. После нажатия кнопки я хочу подождать, пока loginSignal завершает, чтобы сделать некоторые вещи. Сигнал завершается, но мой subscribeCompleted: блок не называется.

Подписка напрямую на next а также completion на loginSignal работать как положено. Так почему не takeUntil: subscribeCompleted: Работа?

[[[button rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:loginSignal] subscribeCompleted:^{
    NSLog(@"COMPLETE");
    // Do some other stuff
}];

Изменить: вот вывод из logAll

2014-08-15 10:52:56.417 app[88791:60b] <RACDynamicSignal: 0x10c58a120> name:  next: <UIButton: 0x10c68a870; frame = (240 80; 40 40); opaque = NO; autoresize = TM+BM; autoresizesSubviews = NO; tag = 1103; layer = <CALayer: 0x10c6894a0>>
2014-08-15 10:52:56.417 app[88791:60b] <RACDynamicSignal: 0x10c58a120> name:  next: <UIButton: 0x10c68a870; frame = (240 80; 40 40); opaque = NO; autoresize = TM+BM; autoresizesSubviews = NO; tag = 1103; layer = <CALayer: 0x10c6894a0>>
2014-08-15 10:53:02.086 app[88791:410b] <RACDynamicSignal: 0x112e2c4b0> name:  next: 1
2014-08-15 10:53:02.087 app[88791:410b] <RACDynamicSignal: 0x10c6ea5d0> name:  next: 1
2014-08-15 10:53:02.087 app[88791:410b] <RACDynamicSignal: 0x10c6ea5d0> name:  next: 1
2014-08-15 10:53:02.088 app[88791:410b] <RACDynamicSignal: 0x10c6b8830> name:  next: 1
2014-08-15 10:53:02.089 app[88791:410b] <RACDynamicSignal: 0x10c6b8830> name:  next: 1
2014-08-15 10:53:02.089 app[88791:410b] <RACDynamicSignal: 0x10c52e570> name:  next: 1
2014-08-15 10:53:02.090 app[88791:410b] <RACDynamicSignal: 0x10c52e570> name:  next: 1

Редактировать 2: Вот loginSignal

RACSignal* loginSignal = [[[RACObserve(obj, loginState) distinctUntilChanged] filter:^BOOL(id value) {
    return ([value integerValue] == LOGGEDIN);
}] takeUntil:[self rac_prepareForReuseSignal]];

1 ответ

Решение

Оказывается, takeUntil: это неправильный способ получить такое поведение. Однажды loginSignal уволен, это вызвало sendCompleted: стрелять несколько раз (следовательно, не стрелять?), даже для кнопок, которые не были нажаты. Лучший способ это flattenMap: и отправить loginSignal,

Правильная версия:

[[[[[button rac_signalForControlEvents:UIControlEventTouchUpInside] flattenMap:^RACStream *(id value) {
    return loginSignal;
}] take:1] subscribeNext:^(id value){
    // DO STUFF!!!
}];
Другие вопросы по тегам