gpt4 book ai didi

ios - Rx swift : Is it bad practice to subscribe to a presented view controllers view model?

转载 作者:搜寻专家 更新时间:2023-11-01 07:13:12 24 4
gpt4 key购买 nike

我是 RxSwift 的新手,我正在尝试在开发过程中实现最佳实践。

在我的主视图 Controller 上,我必须提供一个自定义警报 View Controller ,用户可以在其中将文本输入文本字段并点击确认。假设文本有效,警报将被解除并推送一个新的 View Controller 。

为了避免使用回调或委托(delegate),我提供了警报 View Controller ,然后我的主视图 Controller 订阅了警报 View Controller 的文本字段和确认按钮。

订阅不同的 View Controller 是不好的做法吗?

伪代码:

    let alert = viewModel.textFieldAlert()
present(alert)
alertSubscriptions(alert)

警报订阅:

    alert.textField.rx.text.subscribe(onNext: { [weak self] text in
self?.viewModel.numberOfItems.value = text ?? ""
}).addDisposableTo(disposeBag)

alert.confirmButton.rx.tap.subscribe(onNext: { [weak self] _ in
guard self != nil else { return }
if !self!.viewModel.validText { return }
alert.dismiss()
self!.alertConfirmed()
}).addDisposableTo(disposeBag)

我已经测试了这段代码,它没有任何问题。

最佳答案

我碰巧写了一篇关于这个主题的文章:https://medium.com/@danielt1263/encapsulating-the-user-in-a-function-ec5e5c02045f这篇文章使用了 Promises,但在使用 Rx 时,同样的过程会,恕我直言,应该完成。

我认为像这样的东西会更好:

extension UIViewController {

func infoAlert(title: String, message: String, isValidInput: @escaping (String) -> Bool) -> Observable<String> {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

let confirm = PublishSubject<Void>()
let confirmed = UIAlertAction(title: "OK", style: .default) { (action) in
confirm.onNext()
}

let text = PublishSubject<String>()
alert.addTextField { textField in
textField.placeholder = "Enter Data"
_ = textField.rx.text.orEmpty.bind(to: text)
}

_ = text.map(isValidInput)
.bind(to: confirmed.rx.isEnabled)

alert.addAction(confirmed)

present(alert, animated: true, completion: nil)
return confirm.withLatestFrom(text)
}
}

通过将所有代码包含在序列发射器函数(即返回可观察值的函数)中,您打开了将函数添加到可观察值链的大门。

例如,上面的函数可以通过 View Controller 中的按钮按下进行平面映射,或者以其他方式添加到更复杂的 Observable 管道中。

关于ios - Rx swift : Is it bad practice to subscribe to a presented view controllers view model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43790332/

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