GroupFilterViewModel.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. //
  2. // GroupFilterViewModel.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2021/6/8.
  6. // Copyright © 2021 Fin. All rights reserved.
  7. //
  8. import RealmSwift
  9. import RxCocoa
  10. import RxDataSources
  11. import RxSwift
  12. struct GroupFilterModel {
  13. var name: String?
  14. var checked: Bool
  15. }
  16. class GroupFilterViewModel: ViewModel, ViewModelType {
  17. let groups: [GroupFilterModel]
  18. init(groups: [GroupFilterModel]) {
  19. self.groups = groups
  20. }
  21. struct Input {
  22. var showAllGroups: Driver<Bool>
  23. var doneTap: Driver<Void>
  24. }
  25. struct Output {
  26. var groups: Driver<[SectionModel<String, GroupCellViewModel>]>
  27. var isShowAllGroups: Driver<Bool>
  28. var dismiss: Driver<Void>
  29. }
  30. var done = PublishRelay<[String?]>()
  31. func transform(input: Input) -> Output {
  32. // 页面中的群组cellModel
  33. let groupCellModels = self.groups.map { filterModel in
  34. GroupCellViewModel(groupFilterModel: filterModel)
  35. }
  36. // 点击显示所有群组或隐藏所有群组时,设置cell checked 勾选状态
  37. input.showAllGroups.drive(onNext: { isShowAllGroups in
  38. for model in groupCellModels {
  39. model.checked.accept(isShowAllGroups)
  40. }
  41. }).disposed(by: rx.disposeBag)
  42. // cell checked 状态改变
  43. let checkChanged = Observable.merge(groupCellModels.map { model in
  44. model.checked.asObservable()
  45. })
  46. // 是否勾选了所有群组
  47. let isShowAllGroups =
  48. checkChanged
  49. .map { _ in
  50. groupCellModels.filter { viewModel in
  51. viewModel.checked.value
  52. }.count >= groupCellModels.count
  53. }
  54. input.doneTap.map { () -> [String?] in
  55. let isShowAllGroups = groupCellModels.filter { viewModel in
  56. viewModel.checked.value
  57. }.count >= groupCellModels.count
  58. if isShowAllGroups {
  59. return []
  60. }
  61. return groupCellModels
  62. .filter { $0.checked.value }
  63. .map { $0.name.value }
  64. }
  65. .asObservable()
  66. .bind(to: self.done)
  67. .disposed(by: rx.disposeBag)
  68. let dismiss = PublishRelay<Void>()
  69. input.doneTap.map { _ in () }
  70. .asObservable()
  71. .bind(to: dismiss)
  72. .disposed(by: rx.disposeBag)
  73. return Output(
  74. groups: Driver.just([SectionModel(model: "header", items: groupCellModels)]),
  75. isShowAllGroups: isShowAllGroups.asDriver(onErrorDriveWith: .empty()),
  76. dismiss: dismiss.asDriver(onErrorDriveWith: .empty())
  77. )
  78. }
  79. }