На iOS, для DisposeBag в MVVM, это может быть помещено во ViewModel? - PullRequest
0 голосов
/ 17 мая 2018

Я новичок в RxSwift, и здесь я хотел бы задать вопрос о том, где должен быть DisposeBag.

В моем случае я получил список элементов, отображаемых в виде таблицы, и каждый изу них будет свой собственный флаг, указывающий, выбран ли он.

Так что я не просто привязываю список результатов к представлению таблицы.Мне нужно иметь некоторую логику, которая редактирует список на локальном компьютере, пока пользователь перемещается по таблице.

Я создал экземпляр Variable([Item]) в ViewModel, но если я помещу логику в ViewModel aDisposeBag необходимо.

После некоторого поиска в Google, большинство примеров MVVM + RxSwift, у которых есть экземпляры Variable, помещают DisposeBag в ViewModel, но некоторые говорят, что его следует размещать только вViewController.Это правда?Как я могу прослушать Observable в ViewModel, чтобы моя бизнес-логика могла быть помещена в ViewModel?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Вы можете поместить Disposable или DisposeBag во ViewModel, все зависит от того, когда вы хотите, чтобы подписки умерли.Это хорошая практика, чтобы держать их всех в одном месте, как, например.ViewController.Где будет намного проще обрабатывать подписки, так как иногда вам не нужна подписка для бизнес-логики, напр.когда прокрутка просмотра прокручивается, вы отключаете кнопку.(Но, тем не менее, существуют архитектуры, такие как 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 для вашей базы данных, поэтому она будет генерировать событие каждый развремя изменения вашей сущности.

0 голосов
/ 29 мая 2018

A DisposeBag чаще, чем не следует не помещать в ViewModel, если нет веской причины.

Обычно DisposeBag предназначен для привязки подписок к их владельцу. Обычно это не тот случай, когда ViewModel создает какие-либо подписки, а просто предоставляет Observables, чтобы потребитель мог подписаться на них (например, ViewController).

Это означает, что ViewController - это тот, который обычно содержит DisposeBag, так как обычно он использует подписки (а не сам ViewModel).

0 голосов
/ 17 мая 2018

Да Одноразовую сумку можно поместить в viewModel. Где бы вы ни создавали наблюдаемые объекты, необходимо избавиться от наблюдаемых. Поэтому их также можно использовать в viewModels. Поскольку вы новичок в Rxswift, я рекомендую пройти через этот блог для дополнительной ясности о RxSwift: https://medium.com/@arnavgupta180/shift-from-swift-to-rxswift-8dece8af9f4

...