RxSwift - Observable去除使用过的元素

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 1option 2option 3,用户挑选option 1的第一选择器,我需要的是,当第二拣取器打开,只为用户提供了option 2option 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,告诉它们它们当前是否处于活动状态。然后选择器视图模型filterallAvailableOperationTypes Observable,这是你应该绑定你的选择器。

这里的要点是你的选择器的值也应该绑定到Observable上,而不是静态设置。从你的例子来看,目前还不清楚是否已经如此。

+0

ChildViewModel有一个'Variable'来存储当前值,所以我有一个可观察值。 至于拾取器,先前的拾取器仍然“活着”。假设我从3个选项开始,第一个选择器选择1,然后第二个选择器再次点击第一个选择器,我希望能够选择3。 – pgb