- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 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/
我是一名优秀的程序员,十分优秀!