gpt4 book ai didi

带有 Reactive Cocoa 的 iOS MVVM,UITextField 返回信号和条件 : how to improve my code

转载 作者:行者123 更新时间:2023-11-29 12:25:45 25 4
gpt4 key购买 nike

我正在尝试找到一种方法来改进我的代码,它对我来说还不够“响应式(Reactive)”,但效果很好。
我有一个 UITextfield 并且我想在单击文本字段的返回按钮时发送一个信号(登录我的用户),但前提是满足条件(我有一个信号: registerIsAllowedSignal).

实际上我在这个信号上有一个 subscribe next,我在其中更新了一个 BOOL registerIsAllowed,我在我的 UITextfield 返回按钮 subscribeNext 中手动检查以查看 registerIsAllowed == true,在这种情况下,我发送一个调用我的 register 方法返回一个信号:[self.loginViewModel register]

我想通过删除 bool 值上的“if”并直接使用 registerIsAllowedSignal 来改进我的设计,但我真的不知道该怎么做,我的流程是:
- 我需要我的 registerIsAllowedSignal 在他最后一次解雇时返回 true
- 我需要我的 UITextField 返回信号是最后一个返回 true

因此,如果有人知道我可以如何改进它,那就太好了,但是,如果您认为我的代码“足够 react ”并且我正在做过度杀戮的事情,请告诉我 :)。

谢谢

这是我的实际代码示例:

self.logInAllowedSignal = [[RACSignal combineLatest:@[self.usernameIsValid, self.emailIsValid]] and];
[self.logInAllowedSignal subscribeNext:^(NSNumber *value) {
self.logInAllowed = value.boolValue;
}];
self.registerAllowedSignal = [[RACSignal combineLatest:@[self.logInAllowedSignal, self.passwordIsValid]] and];
[self.registerAllowedSignal subscribeNext:^(NSNumber *value) {
self.registerAllowed = value.boolValue;
}];

及以后:

[[[tmpView.passwordTextField rac_keyboardReturnSignal] doNext:^(id x){
[tmpView.usernameTextField resignFirstResponder];
}]
subscribeNext:^(id x) {
@strongify(self);
if (self.registerAllowed)
{
[[self.loginViewModel register] subscribeNext:^(id x) {
NSLog(@"Register response : %@", x);
}];
}
}];

最佳答案

根据应该发生什么或 [self.loginViewModel register] 返回什么,我可能会做这样的事情:

@weakify(self);
self.logInAllowedSignal = [[RACSignal
combineLatest:@[self.usernameIsValid, self.emailIsValid]]
and];

self.registerAllowedSignal = [[RACSignal
combineLatest:@[self.logInAllowedSignal, self.passwordIsValid]]
and];

RAC(self, someUserObject) = [[[[[tmpView.passwordTextField rac_keyboardReturnSignal]
// resignFirstResponder uses side-effects so we can't avoid the doNext.
doNext:^(id _) {
[tmpView.usernameTextField resignFirstResponder];
}]
flattenMap:^RACStream *(id _) {
@strongify(self);
return self.registerAllowedSignal;
}]
filter:^BOOL(NSNumber *allowedToRegister) {
return [allowedToRegister boolValue];
}]
flattenMap:^RACStream *(id _) {
@strongify(self);
return [self.loginViewModel register];
}];

需要注意的几点:

  • 尽量避免副作用(例如使用 subcribeNextdoNext 等)
  • 避免使用您自己的状态 bool 值 - 直接使用信号。
  • 考虑将格式设置为 proposed by the authors
  • 尽量避免创建循环保留(在我的示例中,我使用了宏 @weakify@strongify)。

我假设 [self.loginViewModel register] 正在返回我们需要开始的信号。与其执行 subscribeNext,不如尝试将其与您想对信号结果执行的操作结合起来。在我的示例中,我将一些用户对象绑定(bind)到结果,但结果也可能触发 View 转换?要记住的关键是尽可能避免副作用。

关于带有 Reactive Cocoa 的 iOS MVVM,UITextField 返回信号和条件 : how to improve my code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29195170/

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