我是RxSwift的新手,在这里我想问一个关于DisposeBag应该在哪里的问题。
我的情况是,我检索了一个在tableview中显示的项目列表,每个项目都有自己的标志,表明它是否被选中。
所以我不只是将结果列表绑定到tableview。当用户通过tableview导航时,我需要有一些编辑本地列表的逻辑。
我在ViewModel
中创建了一个实例ViewModel
,但如果我将逻辑放在DisposeBag
中,则需要Variable
。
在进行了一些谷歌搜索之后,大多数MVVM + RxSwift的例子都有DisposeBag
ViewModel
个ViewController
Observable
ViewModel
,但是有人说它应该只放在{{1} }}。真的吗?如何倾听ViewModel
中的in ...
,以便将我的业务逻辑放在let
中?
答案 0 :(得分:3)
DisposeBag
除非有充分的理由,否则不会被放置在ViewModel中。
通常,DisposeBag
旨在将订阅与其所有者联系起来。通常不是ViewModel创建任何订阅的情况,而是仅提供Observable,以便消费者可以订阅它们(例如ViewController)。
这意味着ViewController通常持有DisposeBag
,因为它通常是使用订阅的(而不是ViewModel本身)。
答案 1 :(得分:0)
是可以将一次性包放置在viewModel中。无论你创建了哪个observable,都需要处理observable。所以它也可以在viewModels中使用。如果你是Rxswift的新手,我建议你去看看此博客进一步明确了RxSwift: https://medium.com/@arnavgupta180/shift-from-swift-to-rxswift-8dece8af9f4
答案 2 :(得分:0)
您可以在ViewModel中放置Disposable
或DisposeBag
,这完全取决于您希望订阅消亡的时间。将它们全部放在一个地方是一种很好的做法,就像前一样。视图控制器。在哪里处理订阅会更容易,因为有时您并不需要订阅业务逻辑,例如。滚动视图滚动时禁用按钮。 (但是,有一些架构,比如RxMVP,反之亦然)
在您的情况下,您可以组合Observables
而不是在ViewModel中使用变量。这一切都取决于你的需求,但你可以有类似的东西:
class ViewModel {
var activeItems: Observable<[Item]> {
return Observable.combineLatest(retrieveData(), itemEdited().startWith(nil)) { (allItems, editedItem) in
// TODO: check if edited item should be in list
}
}
private func retrieveData() -> Observable<[Item]> {
return .empty()
}
private func itemEdited() -> Observable<Item?> {
return .empty()
}
}
如果您有来自Realm或CoreData的这些项目,您可以对数据库使用Rx实现,因此每次修改实体时它都会发出一个事件。