【发布时间】:2017-08-11 15:06:57
【问题描述】:
我将 RxSwift 与 MVVM 一起使用,但我发现自己有点困惑。原因如下:
我现在的代码
视图模型
internal protocol DetailViewModelInput {
func viewDidLoad(with name: String)
}
internal protocol DetailViewModelOutput {
var gnomeObject: Observable<Gnome?> { get }
}
struct DetailViewModel: DetailViewModelType, DetailViewModelInput, DetailViewModelOutput {
let disposeBag = DisposeBag()
let gnomeObject: Observable<Gnome?>
init() {
gnomeObject = viewDidLoadProperty
.asObservable()
.filter { !$0.isEmpty }
.map { guard let gnome = Gnome
.fetch(uniqueValue: $0, forKey: "name")! as? Gnome else { return nil }
return gnome
}
}
let viewDidLoadProperty = Variable<String>("")
func viewDidLoad(with name: String) {
viewDidLoadProperty.value = name
}
}
视图控制器
我按如下方式进行绑定:
func bindViewModel() {
viewModel.outputs.gnomeObject
.subscribe { observable in self.populate(with: observable.element != nil ? observable.element! : nil) }
.addDisposableTo(viewModel.disposeBag)
}
这“很好”。它完美地工作(至少如预期的那样)。 但是,我在阅读以下书时:https://victorqi.gitbooks.io/rxswift/content/tips.html 在提示部分它说:
始终努力将您的系统或其部分建模为纯函数。这些纯函数可以很容易地测试并用于修改操作员的行为。
阅读后,我将 ViewModel 更改如下:
ViewModel(已编辑)
internal protocol DetailViewModelInput {
func viewDidLoad(with name: String)
}
internal protocol DetailViewModelOutput {
func gnomeObject() -> Observable<Gnome?>
}
protocol DetailViewModelType {
var disposeBag: DisposeBag { get }
var inputs: DetailViewModelInput { get }
var outputs: DetailViewModelOutput { get }
}
struct DetailViewModel: DetailViewModelType, DetailViewModelInput {
let disposeBag = DisposeBag()
let viewDidLoadProperty = Variable<String>("")
func viewDidLoad(with name: String) {
viewDidLoadProperty.value = name
}
}
// MARK: DetailViewModelOutput
extension DetailViewModel: DetailViewModelOutput {
func gnomeObject() -> Observable<Gnome?> {
return viewDidLoadProperty
.asObservable()
.filter { !$0.isEmpty }
.map { guard let gnome = Gnome
.fetch(uniqueValue: $0, forKey: "name")! as? Gnome else { return nil }
return gnome
}
}
}
ViewModel 的区别在于 GnomeObject 声明,其中一个是 var,而在“已编辑”中是 func。
我担心的是,每次从 ViewController 调用 gnomeObject() 时,它都会创建一个新的 observable 实例。
在这种情况下,最佳做法应该是什么?
【问题讨论】: