gpt4 book ai didi

ios - 组合信号,但仅在第一个信号发生变化时订阅

转载 作者:行者123 更新时间:2023-11-28 22:20:02 25 4
gpt4 key购买 nike

我想将 UIButton 上的 rac_signalForControlEvent 与一些组合的 textFields 信号结合起来,如下所示:

    [[[[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside]
combineLatestWith:textFieldsCombinedSignal]
filter:^BOOL(RACTuple *signals) {
return ((UIButton *)[signals first]).highlighted;
}] subscribeNext:^(RACTuple *signals) {
if ([signals.second boolValue])
{
[self doLogin];
}
else
{
[self error];
}
}];

但通过这种方式,我必须过滤按钮突出显示的状态,否则 subscribeNext: block 会在每次某些文本字段更改 (textFieldsCombinedSignal) 时触发。

我很想实现这一点而不必过滤突出显示的按钮的状态(毕竟我正在使用 ReactiveCocoa 来最小化状态,而且我不觉得这是做我想做的事情的正确方法做)。

最佳答案

如果您想要一系列按钮点击,然后来自组合文本字段信号的最新信号,它可以像使用 -flattenMap: 一样简单:

[[[self.loginButton
rac_signalForControlEvents:UIControlEventTouchUpInside]
flattenMap:^(id _) {
return [textFieldsCombinedSignal take:1];
}]
subscribeNext:^…];

但是,根据您的描述,这似乎是 RACCommand 的经典案例。这段代码和原始代码都允许用户双击登录按钮并触发并发登录。

在展示 RACCommand 之前,我将对您的代码做出一些假设。仅从名称来看,textFieldsCombinedSignal 它可能是一个发送字符串元组的信号,但在您的使用中,它看起来实际上是一个发送 YES/NO 的验证信号。我假设是后者并将其重命名为 loginIsValid。出于本示例的目的,我还将假设 -doLogin 是同步的。

现在到 RACCommand:

self.loginButton.rac_command = [[RACCommand alloc] initWithEnabledSignal:loginIsValid signalBlock:^(id _) {
return [RACSignal defer:^{
[self doLogin];
return [RACSignal empty];
}];
}];

这将根据 loginIsValid 上发送的最新值启用/禁用登录按钮。启用后,点击按钮将导致调用 -doLogin,并且该按钮将在登录过程中禁用,从而防止并发登录。

关于ios - 组合信号,但仅在第一个信号发生变化时订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com