删除项目 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 单元格