【问题标题】:Deleting item RxSwift MVVM pattern删除项目 RxSwift MVVM 模式
【发布时间】: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)

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

【问题讨论】:

    标签: ios swift mvvm rx-swift


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多