【问题标题】:do(onNext:) called twice when table view row is selected选择表视图行时调用两次 do(onNext:)
【发布时间】:2019-09-12 12:27:01
【问题描述】:

在 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)
    }

【问题讨论】:

    标签: ios swift uitableview uinavigationcontroller rx-swift


    【解决方案1】:

    首先,这是 RxSwift 吗? 如果是这样,当您通过订阅接收到新事件时, .do(onNext:) 运算符会提供副作用;因此,当点击表格行时会发生两种“反应”:1. 订阅方法和 2. .do(onNext:) 事件。不幸的是,我对您的代码没有任何进一步的了解,因此可能还有其他东西会导致该错误。 祝你好运!

    【讨论】:

    • 是的,我正在研究 RxSwift 和 Clean Architecture。我刚刚附上了上面的视图控制器代码。请结帐。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2019-08-07
    相关资源
    最近更新 更多