删除项目 RxSwift MVVM 模式

Posted

技术标签:

【中文标题】删除项目 RxSwift MVVM 模式【英文标题】:Deleting item RxSwift MVVM pattern 【发布时间】:2019-11-10 10:54:30 【问题描述】:

您好,有一个带有部分的 tableview,我正在调用 API 来填充 tableView。我也在使用 MVVm 架构。现在用户可以删除项目,但我尝试重新加载部分或 tableView 但没有任何反应,因为已删除的项目仍保留在 tableView 中。下面是我的代码。任何帮助表示赞赏

我的视图模型

Observable.zip(identiferElements, deviceElements).map (identifers, devices, _) -> [MyInfoSection] in
            var items: [MyInfoSection] = []
            let identiferRepository = identifers.map( (repository) -> MyInfoSectionItem in
                let cellViewModel = IdentifiersCellViewModel(with: repository)
                return MyInfoSectionItem.identifiersItem(viewModel: cellViewModel)
            )
            if identiferRepository.isNotEmpty 
                items.append(MyInfoSection.setting(title: "Identifier", items: identiferRepository))
            

            let deviceRepository = devices.map( (repository) -> MyInfoSectionItem in
                let cellViewModel = DevicesCellViewModel(with: repository)
                return MyInfoSectionItem.devicesItem(viewModel: cellViewModel)
            )
            if deviceRepository.isNotEmpty 
                items.append(MyInfoSection.setting(title: "Active Devices", items: deviceRepository))
            
            return items
        .bind(to: elements).disposed(by: rx.disposeBag) 

deletedEvent.drive(onNext:  (item) in

            switch item 
            case .identifiersItem(let viewModel):
                identiferDeleted.onNext(viewModel.repository)
            case .devicesItem(let viewModel):
                deviceDeleted.onNext(viewModel.repository)
            
        ).disposed(by: rx.disposeBag)

        identiferDeleted.asObservable().flatMapLatest( [weak self] (value) -> Observable<ResponseBase> in
            log(value)
            guard let self = self, let id = value.id else  return Observable.just(ResponseBase()) 
            return self.provider.deleteAddress(id: id)
                .trackActivity(self.loading)
                .trackError(self.error)
        ).subscribe(onNext:  (res) in
            log(res)

        ).disposed(by: rx.disposeBag) 

视图控制器

//viewDidLoad

let input = MyInfoViewModel.Input(trigger: refresh, segmentSelection: segmentSelected, selection: tableView.rx.modelSelected(MyInfoSectionItem.self).asDriver(), deleted: tableView.rx.modelDeleted(MyInfoSectionItem.self).asDriver())
        let output = viewModel.transform(input: input)

将根据要求添加更多代码。谢谢

【问题讨论】:

【参考方案1】:

使用combineLatest 而不是zip。用户一次只能从一个部分中删除一个项目,并且 zip 会等到 both 部分在发出之前发出一个新值。可能还有其他问题,但这是肯定的。

我需要查看您的视图模型的可编译代码以提供进一步帮助。

【讨论】:

好的@Daniel T。我可以分享一个要点来展示视图模型吗? 我已经创建了一个 gist gist.github.com/AdieOlami/9725ba8f9bd8482c6406e5bf1a6a9e60 你可以在那里查看视图模型 要么删除不必要的不​​编译的部分,要么添加代码使其编译。

以上是关于删除项目 RxSwift MVVM 模式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MVVM 和 RxSwift 编辑/删除 UICollectionView 单元格

RxSwift MVVM 如何使用项目管理器设置视图模型?

RxSwift 以及如何制作简单的 TableViewController?

用于搜索屏幕的 MVVM 和 RxSwift

传递数据 MVVM 和 RxSwift

带有 RxSwift 的 MVVM