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!!!
}];