Как управлять древовидными моделями данных, привязанными к TableViewCell, с помощью RxSwift - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть модель данных, как показано ниже, View structure

[Car Brand] has [Types] has Year or specific model (string)

, например

BMW > Z4 > 2005
BMW > Z3 > 1999
BMW > Z3 > 2001
Porshe > Carrera > 1999
Audi > TT > 2002

YearC backgroundView backgroundColor необходимо изменить после выбора.Я добавил tapGesture в yearView, а затем попытался прослушать все YearViews из Type Cell

var carForType = PublishSubject<SelectedCar>() // in class property
let bv = yearContainer(frame: .zero, withOption: option)
bv.tap.rx.event.asObservable().map({ _ -> Selected in
    return SelectedBet.init(car: nil, type: self.type, year: option)
})
    .bind(to: self.typeForCar)
    .disposed(by: self.disposeBag)

И из TableVC я пытаюсь получить все выбранные автомобили

cell.selectedCars.debug().subscribe(onNext: {
    var car = $0
    pBet.brand = self.viewModel.brand
    print(car)
}).disposed(by: self.disposeBag)

Но после прокрутки он дважды подписывается на ячейки, и в целом я начал думать, что должен быть лучший способ сделать это.Было бы здорово, чтобы мнения о том, как упростить, я готов изменить всю структуру.

Примечание: Проект использует расширение MVVM и RxDataSources.

1 Ответ

0 голосов
/ 13 декабря 2018

Спасибо за сообщество RxSwift, мне удалось найти такие же варианты использования.Как объяснено здесь от kzaher, disposeBags, используемые ячейкой, должны быть освобождены в методе prepareForReuse ячейки.

Но я использовал другой подход, который не требует disposeBag в ячейке.Я добавил все tapEvents в один массив в ячейке и объединил его в одну наблюдаемую, а затем в tableView сделал то же самое, конечно же, объединив все наблюдаемые ячейки в одну, прежде чем объединить, я отобразил tapObservables в модель, которая содержит информацию обо всей машине.подробности.Это стало похоже на цепочку ответственности [ 2 ]

Merge and map explanation

Вот код для более подробной информации.

В ВК всеподписки сделаны.

dataSource = RxTableViewSectionedReloadDataSource<MarketsSectionData>(configureCell: { (dataSource, tableView, indexPath, _) in
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) as? AllCarsCell else {
        return UITableViewCell()
    }

    let market = dataSource.sectionModels[indexPath.section].items[indexPath.row]
    cell.setUpWith(market: market)
    let sel = cell.selectionsForMarket?.map({ car -> SelectedCar in
        var tCar = car
        tCar.brand = self.viewModel.brand
        return tCar
    })
    self.selectionCells.onNext(sel!)
    cell.findSelectedCellAndFill(withId: self.viewModel.currentCar?.id)
    self.viewModel.selection.subscribe(onNext: { car in
        cell.findSelectedCellAndFill(withId: car.option?.id)
    }, onDisposed: {
        print("deque is disposed")
    }).disposed(by: self.disposeBag)

    return cell
})

self.selectionCells.merge().bind(to: self.viewModel.selection).disposed(by: self.disposeBag)

В ячейке я соединяю все виды в одну наблюдаемую, похожую на такую ​​же

self.selectionsForMarket = Observable.from(tapActions).merge()

И представление без состояния имеет только tapGesture.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...