在iOS上,对于MVVM中的DisposeBag,它可以放在ViewModel中吗?

时间:2018-05-17 02:59:10

标签: ios swift mvvm rx-swift

我是RxSwift的新手,在这里我想问一个关于DisposeBag应该在哪里的问题。

我的情况是,我检索了一个在tableview中显示的项目列表,每个项目都有自己的标志,表明它是否被选中。

所以我不只是将结果列表绑定到tableview。当用户通过tableview导航时,我需要有一些编辑本地列表的逻辑。

我在ViewModel中创建了一个实例ViewModel,但如果我将逻辑放在DisposeBag中,则需要Variable

在进行了一些谷歌搜索之后,大多数MVVM + RxSwift的例子都有DisposeBag ViewModelViewController Observable ViewModel,但是有人说它应该只放在{{1} }}。真的吗?如何倾听ViewModel中的in ...,以便将我的业务逻辑放在let中?

3 个答案:

答案 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中放置DisposableDisposeBag,这完全取决于您希望订阅消亡的时间。将它们全部放在一个地方是一种很好的做法,就像前一样。视图控制器。在哪里处理订阅会更容易,因为有时您并不需要订阅业务逻辑,例如。滚动视图滚动时禁用按钮。 (但是,有一些架构,比如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实现,因此每次修改实体时它都会发出一个事件。