Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. import RxSwift
  2. import RxRelay
  3. import RxDataSources
  4.  
  5. class TodoListViewModel {
  6. private let todoListCellViewModelsBehaviorRelay = BehaviorRelay<[TodoListCellViewModel]>(value: [])
  7. private var notStartedSectionObservable: Observable<TodoListSection> {
  8. return todoListCellViewModelsBehaviorRelay
  9. .flatMapLatest { viewModels -> PrimitiveSequence<SingleTrait, [TodoListCellViewModel]> in
  10. Observable.from(viewModels)
  11. .flatMapLatest { viewModel in
  12. viewModel.todoStatusObservable
  13. .take(1)
  14. .filter { $0 == .notStarted }
  15. .map { _ in viewModel }
  16. }
  17. .toArray()
  18. }
  19. .map { TodoListSection(header: "Not Started", items: $0) }
  20. }
  21. private var startedSectionObserverable: Observable<TodoListSection> {
  22. return todoListCellViewModelsBehaviorRelay
  23. .flatMapLatest { viewModels -> PrimitiveSequence<SingleTrait, [TodoListCellViewModel]> in
  24. Observable.from(viewModels)
  25. .flatMapLatest { viewModel in
  26. viewModel.todoStatusObservable
  27. .take(1)
  28. .filter { $0 == .started }
  29. .map { _ in viewModel }
  30. }
  31. .toArray()
  32. }
  33. .map { TodoListSection(header: "Started", items: $0) }
  34. }
  35. private var finishedSectionObservable: Observable<TodoListSection> {
  36. return todoListCellViewModelsBehaviorRelay
  37. .flatMapLatest { viewModels -> PrimitiveSequence<SingleTrait, [TodoListCellViewModel]> in
  38. Observable.from(viewModels)
  39. .flatMapLatest { viewModel in
  40. viewModel.todoStatusObservable
  41. .take(1)
  42. .filter { $0 == .finished }
  43. .map { _ in viewModel }
  44. }
  45. .toArray()
  46. }
  47. .map { TodoListSection(header: "Not Started", items: $0) }
  48. }
  49.  
  50. var addButtonObserver: AnyObserver<Void> {
  51. return AnyObserver { _ in
  52. let todoListCellViewModel = TodoListCellViewModel(with: Todo(title: "Todo: \(self.todoListCellViewModelsBehaviorRelay.value.count)", todoStatus: .notStarted))
  53. self.todoListCellViewModelsBehaviorRelay.accept(self.todoListCellViewModelsBehaviorRelay.value + [todoListCellViewModel])
  54. }
  55. }
  56.  
  57. // 1
  58. var todoSelectedObserver: AnyObserver<TodoListCellViewModel> {
  59. return AnyObserver {
  60. guard
  61. let element = $0.element,
  62. let selectedViewModel = self.todoListCellViewModelsBehaviorRelay.value.first(where: { viewModel -> Bool in
  63. viewModel === element
  64. })
  65. else { return }
  66.  
  67. selectedViewModel.updateTodoStatusObserver.onNext(())
  68. self.todoListCellViewModelsBehaviorRelay.accept(self.todoListCellViewModelsBehaviorRelay.value)
  69. }
  70. }
  71.  
  72. var todoListSectionsObservable: Observable<[TodoListSection]> {
  73. return Observable
  74. .combineLatest(notStartedSectionObservable, startedSectionObserverable, finishedSectionObservable)
  75. .map { [$0, $1, $2] }
  76. }
  77.  
  78. let dataSource = RxTableViewSectionedReloadDataSource<TodoListSection>(configureCell: {dataSource, tableView, indexPath, item in
  79. guard let cell = tableView.dequeueReusableCell(withIdentifier: "TodoListTableViewCell") as? TodoListTableViewCell else { return UITableViewCell() }
  80. cell.bind(to: item)
  81.  
  82. return cell
  83. })
  84.  
  85. init() {
  86. dataSource.titleForHeaderInSection = { dataSource, index in
  87. return dataSource.sectionModels[index].header
  88. }
  89. }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement