do (onNext :) вызывается дважды, когда выбрана строка представления таблицы - PullRequest
0 голосов
/ 23 апреля 2019

Я столкнулся с проблемой при выборе строки табличного представления в RxSwift. Для подробностей, код функции do (onNext :) вызывается дважды, что также приводит к двойному нажатию на навигацию. Вот мой код в ViewModel, пожалуйста, помогите мне решить его. Большое спасибо.

struct Input {
    let loadTrigger: Driver<String>
    let searchTrigger: Driver<String>
    let selectMealTrigger: Driver<IndexPath>
}

struct Output {
    let mealList: Driver<[Meal]>
    let selectedMeal: Driver<Meal>
}

func transform(_ input: HomeViewModel.Input) -> HomeViewModel.Output {
    let popularMeals = input.loadTrigger
        .flatMap { _ in
            return self.useCase.getMealList()
            .asDriver(onErrorJustReturn: [])
    }

    let mealSearchList = input.searchTrigger
        .flatMap { text in
            return self.useCase.getMealSearchList(mealName: text)
            .asDriver(onErrorJustReturn: [])
    }

    let mealList = Observable.of(mealSearchList.asObservable(), popularMeals.asObservable()).merge().asDriver(onErrorJustReturn: [])

    let selectedMeal = input.selectMealTrigger
        .withLatestFrom(mealList) { $1[$0.row] }
        .do(onNext: { meal in
            self.navigator.toMealDetail(meal: meal)
        })

    return Output(mealList: mealList, selectedMeal: selectedMeal)
}

Редактировать: вот реализация на ViewController:

func bindViewModel() {
    self.tableView.delegate = nil
    self.tableView.dataSource = nil
    let emptyTrigger = searchBar
    .rx.text.orEmpty
    .filter { $0.isEmpty }
    .throttle(0.1, scheduler: MainScheduler.instance)
    .asDriver(onErrorJustReturn: "")

    let loadMealTrigger = Observable
    .of(emptyTrigger.asObservable(), Observable.just(("")))
    .merge()
    .asDriver(onErrorJustReturn: "")

    let searchTrigger = searchBar.rx.text.orEmpty.asDriver()
    .distinctUntilChanged()
    .filter {!$0.isEmpty }
    .throttle(0.1)

    let selectMealTrigger = tableView.rx.itemSelected.asDriver()

    let input = HomeViewModel.Input(
        loadTrigger: loadMealTrigger,
        searchTrigger: searchTrigger,
        selectMealTrigger: selectMealTrigger
    )

    let output = viewModel.transform(input)

        output.mealList
            .drive(tableView.rx.items(cellIdentifier: MealCell.cellIdentifier)) { index, meal, cell in
                let mealCell = cell as! MealCell
                mealCell.meal = meal
    }
    .disposed(by: bag)

    output.selectedMeal
    .drive()
    .disposed(by: bag)
    }

1 Ответ

0 голосов
/ 23 апреля 2019

Во-первых, это RxSwift?Если это так, оператор .do (onNext :) предоставляет побочные эффекты при получении нового события через подписку;Следовательно, при касании строки таблицы произойдут две «реакции»: 1. метод подписки и 2. .do (onNext :) событие.К сожалению, у меня нет дальнейшей информации о вашем коде, поэтому могут быть и другие вещи, создающие эту ошибку.Удачи!

...