Как обрабатывать навигацию с помощью наблюдаемых с помощью Rx-MVVM-C - PullRequest
0 голосов
/ 09 января 2019

Здравствуйте, я пытаюсь сделать проект с помощью RxSwift, и я застрял, пытаясь правильно установить соединение между Координатором и ViewModel.

Гол

Используя наблюдаемые, Координатор получает и событие (в этом случае, когда строка была нажата), тогда делает все, что угодно .

Сценарий

Предоставление Поста (Строка)

typealias Post = String

У меня есть следующий Координатор :

class Coordinator {

    func start() {

        let selectedPostObservable = PublishSubject<Post>()

        let viewController = ViewController()
        let viewModel = ViewModel()
        viewController.viewModel = viewModel

        selectedPostObservable.subscribe { post in
            //Do whatever
        }
    }
}

selectedPostObservable - это то, что я не знаю, как подключить его «чистым» способом к модели представления.

как ViewModel :

class ViewModel {

    struct Input {
        let selectedIndexPath: Observable<IndexPath>
    }

    struct Output { 
        //UI Outputs
    }

    func transform(input: Input) -> Output {
        let posts: [Post] = Observable.just(["1", "2", "3"])

        //Connect with selectedindex
        let result = input.selectedIndexPath
            .withLatestFrom(posts) { $1[$0.row] }
            .asDriver(onErrorJustReturn: nil)

        return Output()
    }
}

Переменная result - это то, что я должен связать с selectedPostObservable .

И ViewController (хотя я думаю, что не имеет отношения к вопросу):

class ViewController: UIViewController {

    //...
    var viewModel: ViewModel!
    var tableView: UITableView!
    //...

    func bindViewModel() {
        let input = ViewModel.Input(selectedIndexPath: tableView.rx.itemSelected.asObservable())
        viewModel.transform(input: input)
    }
}

Большое спасибо.

1 Ответ

0 голосов
/ 10 января 2019

Работая со структурой, с которой вы начинаете, я бы поместил PublishSubject в класс ViewModel вместо Coordinator. Тогда как то так:

class ViewModel {

    struct Input {
        let selectedIndexPath: Observable<IndexPath>
    }

    struct Output { 
        //UI Outputs
    }

    let selectedPost = PublishSubject<Post>()
    let bag = DisposeBag()

    func transform(input: Input) -> Output {
        let posts: [Post] = Observable.just(["1", "2", "3"])

        //Connect with selectedindex
        input.selectedIndexPath
            .withLatestFrom(posts) { $1[$0.row] }
            .bind(to: selectedPost)
            .disposed(by: bag)

        return Output()
    }
}

class Coordinator {

    func start() {

        let viewController = ViewController()
        let viewModel = ViewModel()
        viewController.viewModel = viewModel

        viewModel.selectedPost.subscribe { post in
            //Do whatever
        }
        .disposed(by: viewModel.bag)
    }
}
...