OStack程序员社区-中国程序员成长平台

标题: ios - ReactiveCocoa 将最新消息与按钮按下和文本字段代表信号相结合 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 08:06
标题: ios - ReactiveCocoa 将最新消息与按钮按下和文本字段代表信号相结合

我创建了一个信号来包装 UITextField 委托(delegate)方法 textFieldShouldReturn:

- (RACSignal *)textFieldReturnPressed
{
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[self rac_signalForSelectorselector(textFieldShouldReturn
                       fromProtocolprotocol(UITextFieldDelegate)]
        subscribeNext:^(RACTuple *tuple) {
            [subscriber sendNext:tuple.first];
        }];

        return nil;
    }];
}

在 viewDidLoad 中,我尝试订阅此信号和按下按钮的组合。实际上,我希望用户能够点击一个按钮并做一些事情(登录),或者按键盘上的返回并做同样的事情(登录)。

我创建了以下信号来组合这两个信号:

RACSignal *loginSignal = [RACSignal
                          combineLatest[[loginButton
                                                     rac_signalForControlEvents:UIControlEventTouchUpInside],
                                                    [self textFieldReturnPressed]]];

然后我像这样订阅这个事件:

[loginSignal
    subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];

当我按下键盘上的返回键时,上面的日志不会打印(尽管我已经验证 sendNext 是从信号中调用的)。但是,当我触发登录按钮信号时,日志会打印 ie。 combineLatest 通过信号。

我已经尝试将 startWith:nil 添加到 loginButton 信号,因为正如我在其他帖子/Github 问题中发现的那样,CombineLatest 要求每个信号至少发送一次,但我的流会立即执行。

我确信我可以在那个时候以某种方式过滤以防止流执行,但这感觉有点 hacky。有什么建议吗?



Best Answer-推荐答案


combineLatest 没有达到预期效果的原因是它需要传递的每个信号至少发送一个下一个事件,以便订阅者开始接收下一个事件。

要实现您想要的效果,即两个信号,每个信号都传递下一个事件,而与另一个状态无关,您应该merge:信号。

例子:

RACSignal *loginSignal = [[loginButton 
                          rac_signalForControlEvents:UIControlEventTouchUpInside] 
                         merge:[self textFieldReturnPressed]];

关于ios - ReactiveCocoa 将最新消息与按钮按下和文本字段代表信号相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903342/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4