ios - ReactiveCocoa takeUntil : doesn't send completion?

标签 ios reactive-cocoa

我正在做一些基本的信号链。按下按钮后,我想等到 loginSignal 完成才能做一些事情。信号完成,但我的 subscribeCompleted: block 没有被调用。

loginSignal 上直接订阅 nextcompletion 会按预期工作。那么,为什么 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]];

最佳答案

事实证明,takeUntil: 并不是获得此行为的正确方法。 loginSignal 触发后,它会导致 sendCompleted: 触发多次(因此看起来没有触发?),即使对于尚未点击的按钮也是如此。更好的方法是 flattenMap: 并发送 loginSignal

正确的版本:

[[[[[button rac_signalForControlEvents:UIControlEventTouchUpInside] flattenMap:^RACStream *(id value) {
    return loginSignal;
}] take:1] subscribeNext:^(id value){
    // DO STUFF!!!
}];

关于ios - ReactiveCocoa takeUntil : doesn't send completion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25330320/

相关文章:

ios - 从共享属性的 NSArray 中查找 NSManagedObjects

ios - 试图了解 ReactiveCocoa

ios - ReactiveCocoa : Subscribe only to new values

ios - 如何在 Objective C 中创建 UITextField 的自定义委托(delegate)

ios - UIScrollView 中的 UITextView - 动态高度?

objective-c - 模态视图 Controller 是替代 iPad 上整个界面的首选方式吗?

ios - 如何制作在应用程序状态中保持一致的 UNUserNotification?

ios - 如何使用 Reactive Cocoa 并行 AFNetworking 请求并按顺序处理响应

ios - 基于 UITextField 中文本的响应式(Reactive) Cocoa 启用按钮

ios - 如何使用 ReactiveCocoa 知道所有对象何时异步保存