【问题标题】:ReactiveCocoa Combine Latest with Button press and Text Field Delegate SignalReactiveCocoa 将最新消息与按钮按下和文本字段代表信号相结合
【发布时间】:2015-06-17 22:13:36
【问题描述】:

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

- (RACSignal *)textFieldReturnPressed
{
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[self rac_signalForSelector:@selector(textFieldShouldReturn:)
                       fromProtocol:@protocol(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。有什么建议吗?

【问题讨论】:

    标签: ios objective-c reactive-programming reactive-cocoa


    【解决方案1】:

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

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

    例子:

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

    【讨论】:

    • 通过 RAC 文档“返回一个信号,该信号传递每个给定信号的值,并在所有信号完成时发送完成。如果任何信号发送错误,返回的信号将立即发送错误。 "我遇到的问题是,当任何一个信号完成时,我都需要这个信号来完成。否则,当我的登录引发错误时,它会不断回调该信号,因为它在技术上尚未完成(用户按下按钮或键盘上的回车键)。
    • 如果我理解正确,您可以使用[loginSignal take:1] 在任一信号将其第一个值发送为next 后使其完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多