简体   繁体   English

删除项目 RxSwift MVVM 模式

[英]Deleting item RxSwift MVVM pattern

Hi have a tableview with sections and I am making API call to populate the tableView.嗨,有一个带有部分的 tableview,我正在调用 API 来填充 tableView。 I am also using the MVVm architecture.我也在使用 MVVm 架构。 Now users are able to delete items but I try reloading the sections or tableView but nothing happens as the deleted item still remains in the tableView.现在用户可以删除项目,但我尝试重新加载部分或 tableView 但没有任何反应,因为删除的项目仍保留在 tableView 中。 Below is my code.下面是我的代码。 Any help is appreciated任何帮助表示赞赏

My ViewModel我的视图模型

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) 

ViewController视图控制器

//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)

More code would be added based on request.将根据要求添加更多代码。 Thanks谢谢

Use combineLatest instead of zip .使用combineLatest而不是zip The user can only delete an item out of one section at a time and zip waits until both sections emit a new value before emitting.用户一次只能从一个部分中删除一个项目,并且 zip 等到两个部分都发出一个新值后再发出。 There might be other problems, but that is one for sure.可能还有其他问题,但这是肯定的。

I would need to see compilable code for your view model to help further.我需要查看您的视图 model 的可编译代码以提供进一步帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM