RxSwift - Observable去除使用过的元素
在我的应用程序中,我有一个采集器集合。每个选择器从服务中获取其值。RxSwift - Observable去除使用过的元素
的应用布局看起来是这样的:
--------------------
- picker 1 -
--------------------
- add picker -
--------------------
您可以点击add picker
添加更多选择器,它被放置在一个UIStackView
。每个选择器都支持它的UIViewController
并有自己的viewModel,而容器视图控制器也有一个viewModel。
你点击add picker
一些时间后,你会得到这样的事情:
--------------------
- picker 1 -
--------------------
- picker 2 -
--------------------
- picker 3 -
--------------------
当您点击每个挑选,我显示一组选项给用户。这些选项来自Web服务,该服务由查看模型包装在Observable<OperationType>
中。
说服务返回option 1
,option 2
,option 3
,用户挑选option 1
的第一选择器,我需要的是,当第二拣取器打开,只为用户提供了option 2
和option 3
。
在我的主视图模型我有这样的代码:
var children = Variable<[ChildViewModel]>([])
var allAvailableOperationTypes: Observable<[OperationType]> {
return RequestManager.sharedInstance.rx
.catalogues()
.asObservable()
.map { return $0.operationTypes }
}
}
然后我创建了一个新Observable
处理的最后一个值从allAvailableOperationTypes
结合和那些已经选择了“删除”。
是这样的:如果用户选择了在第一拾取器的值
operationTypeButton.rx.tap
.asObservable()
.withLatestFrom(viewModel.availableOperationTypes)
.subscribe(onNext: { [unowned self] (operationTypes) in
self.presentPicker(forOperationTypes: operationTypes)
})
.addDisposableTo(disposeBag)
,然后补充说:
var availableOperationTypes: Observable<[OperationType]> {
return allAvailablePriceOperationTypes
.map { (operationTypes) in
operationTypes.filter { // keep those not used in children }
}
}
}
在视图控制器,我将它绑定到按钮像第二个,第二个选择器将只包括“免费”选项。但是,第一个选择器仍然会显示所有可用的选项。
我想达到的目的是让它变得很热,这样当用户点击选择器按钮时,它只显示他可以选择的选项。
如果我理解正确,您希望您的UIPickerView显示所有可用选项,直到另一个选项打开为止,此时以前激活的选取器应该折叠为当前选定的值。这意味着您的选择器视图模型应该提供一个Observable,告诉它们它们当前是否处于活动状态。然后选择器视图模型filter
allAvailableOperationTypes
Observable,这是你应该绑定你的选择器。
这里的要点是你的选择器的值也应该绑定到Observable上,而不是静态设置。从你的例子来看,目前还不清楚是否已经如此。
ChildViewModel有一个'Variable'来存储当前值,所以我有一个可观察值。 至于拾取器,先前的拾取器仍然“活着”。假设我从3个选项开始,第一个选择器选择1,然后第二个选择器再次点击第一个选择器,我希望能够选择3。 – pgb