Swift 5:如何获得BehaviorRelay的值,并与RxSwift和MVVM绑定



我试图从视图模型中的服务中获取金额值,然后在ViewController中将其绑定到amountLabel。

这是我的ViewModel:

class AmountViewModel {

private let accountService: AccountManagerProtocol        

let _amount = BehaviorRelay<Int>(value: 0)
let amount: Observable<Int>

private let disposeBag = DisposeBag()

init(accountService: AccountManagerProtocol = AccountManager()) {
self.accountService = accountService

amount = _amount.asObservable()

getAmount()   
}
func getAmount(){
accountService.getAccount()
.map{ $0.amount ?? 0 }
.bind(to: _amount)
.disposed(by: disposeBag)
}
}

这是我的ViewController,我做了这样的事情,以获得viewModel的数量,但我觉得这不是最好的方法,我想获得数量的值,并能够以更简单的方式将其绑定到amountLabel。

private extension AmountViewController {
private func bindViewModel() {
amountView.titleLabel.text = viewModel.title

//Get Amount
viewModel.amount
.observe(on: MainScheduler.instance)
.withUnretained(self)
.subscribe(onNext: { owner, amount in
if let amountString = amount.currencyToString() {
owner.inputAmountView.amountLabel.text = "BALANCE: (amountString)"
}
})
.disposed(by: disposeBag)
}   

这里是最明显的简化:

class AmountViewModel {
let amount: Observable<Int>

init(accountService: AccountManagerProtocol = AccountManager()) {
amount = accountService.getAccount()
.map { $0.amount ?? 0 }
}
}
private extension AmountViewController {
private func bindViewModel() {
viewModel.amount
.compactMap { $0.currencyToString().map { "BALANCE: ($0)"} }
.observe(on: MainScheduler.instance)
.bind(to: inputAmountView.amountLabel.rx.text)
.disposed(by: disposeBag)
}
}

但我想我会把compactMap闭包中的代码移到视图模型中。。。

相关内容

最新更新