gpt4 book ai didi

ios - RxSwift 点击事件未触发

转载 作者:行者123 更新时间:2023-11-30 10:57:10 24 4
gpt4 key购买 nike

我正在使用 RxSwif 实现 mvvm。

发生的情况是这样的:

  • 验证字段(在两个文本字段中写入 7 个字符)。
  • 点击登录按钮。
  • 调用了 API,这很好。
  • 再次点击该按钮。
  • 未调用 API。

我注意到,每次我在文本字段中写入内容时,“validObservable”都会发生变化,这很好。

View Controller :

    var viewModel: LoginViewModelType!
let disposeBag = DisposeBag()
@IBOutlet weak var dniTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var logInButton: UIButton!

override func viewDidLoad() {
super.viewDidLoad()


logInButton.rx
.tap
.bind(to: viewModel.inputs.logInButtonDidTap)
.disposed(by: disposeBag)


dniTextField.rx
.text
.bind(to: viewModel.inputs.dniChanged)
.disposed(by: disposeBag)

passwordTextField.rx
.text
.bind(to: viewModel.inputs.passwordChanged)
.disposed(by: disposeBag)


/*viewModel.outputs.isLoginButtonEnabled
.drive(onNext: { [weak self] isEnabled in
guard let `self` = self else { return }
self.logInButton.isEnabled = isEnabled
})
.disposed(by: disposeBag)
*/

viewModel.outputs.logIn
.drive(onNext: { [weak self] user in
guard let `self` = self else { return }
self.performSegue(withIdentifier: "showMainController", sender: user)
})
.disposed(by: disposeBag)
}

override func awakeFromNib() {
super.awakeFromNib()
viewModel = LoginViewModel()
}

View 模型:

    var inputs: LoginViewModelInputs { return self }
var outputs: LoginViewModelOutputs { return self }

// ---------------------
// MARK: - Inputs
// ---------------------
var dniChanged: BehaviorRelay<String?>
var passwordChanged: BehaviorRelay<String?>
var logInButtonDidTap: PublishSubject<Void> = PublishSubject<Void>()


// ---------------------
// MARK: - Outpuds
// ---------------------
var logIn: Driver<User>
var isLoginButtonEnabled: Driver<Bool>

private let disposeBag = DisposeBag()

public init () {
dniChanged = BehaviorRelay<String?>(value: "")
passwordChanged = BehaviorRelay<String?>(value: "")

let dniObservable = dniChanged.asDriver().filterNil().asObservable()
let passwordObservable = passwordChanged.asDriver().filterNil().asObservable()

let dniValidation = dniObservable.map { $0.count > 4 }
let passwordValidation = passwordObservable.map { $0.count > 3 }

let validObservable = Observable.combineLatest(dniValidation, passwordValidation) { return $0 && $1 }.filter { $0 }

isLoginButtonEnabled = validObservable.asDriver(onErrorDriveWith: .empty())

let loginSuccessObservable = Observable.combineLatest(dniObservable, passwordObservable, validObservable) { (dni, password, valid) -> LogInRequest in
return LogInRequest(dni: dni, password: password)
}

logIn = logInButtonDidTap.withLatestFrom(loginSuccessObservable).flatMapLatest({ request -> Observable<User> in
return API.shared.post(endpoint: EndPoints.Authorize, type: User.self, body: request)
}).asDriver(onErrorDriveWith: .empty())
}

最佳答案

我想说 .empty() 导致 observable 完成,并且订阅因此被处置。

我会放置一些 .debug() 指令来确定什么被处理以及何时被处理。

关于ios - RxSwift 点击事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53836872/

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