Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import RxSwift
- import RxRelay
- import RxDataSources
- class TodoListViewModel {
- private let todoListCellViewModelsBehaviorRelay = BehaviorRelay<[TodoListCellViewModel]>(value: [])
- // 1
- private var notStartedSectionObservable: Observable<TodoListSection> {
- return todoListCellViewModelsBehaviorRelay
- .flatMapLatest { viewModels -> PrimitiveSequence<SingleTrait, [TodoListCellViewModel]> in
- Observable.from(viewModels)
- .flatMapLatest { viewModel in
- viewModel.todoStatusObservable
- .take(1)
- .filter { $0 == .notStarted }
- .map { _ in viewModel }
- }
- .toArray()
- }
- .map { TodoListSection(header: "Not Started", items: $0) }
- }
- // 2
- private var startedSectionObserverable: Observable<TodoListSection> {
- return todoListCellViewModelsBehaviorRelay
- .flatMapLatest { viewModels -> PrimitiveSequence<SingleTrait, [TodoListCellViewModel]> in
- Observable.from(viewModels)
- .flatMapLatest { viewModel in
- viewModel.todoStatusObservable
- .take(1)
- .filter { $0 == .started }
- .map { _ in viewModel }
- }
- .toArray()
- }
- .map { TodoListSection(header: "Started", items: $0) }
- }
- // 3
- private var finishedSectionObservable: Observable<TodoListSection> {
- return todoListCellViewModelsBehaviorRelay
- .flatMapLatest { viewModels -> PrimitiveSequence<SingleTrait, [TodoListCellViewModel]> in
- Observable.from(viewModels)
- .flatMapLatest { viewModel in
- viewModel.todoStatusObservable
- .take(1)
- .filter { $0 == .finished }
- .map { _ in viewModel }
- }
- .toArray()
- }
- .map { TodoListSection(header: "Not Started", items: $0) }
- }
- var addButtonObserver: AnyObserver<Void> {
- return AnyObserver { _ in
- let todoListCellViewModel = TodoListCellViewModel(with: Todo(title: "Todo: \(self.todoListCellViewModelsBehaviorRelay.value.count)", todoStatus: .notStarted))
- self.todoListCellViewModelsBehaviorRelay.accept(self.todoListCellViewModelsBehaviorRelay.value + [todoListCellViewModel])
- }
- }
- let dataSource = RxTableViewSectionedReloadDataSource<TodoListSection>(configureCell: {dataSource, tableView, indexPath, item in
- guard let cell = tableView.dequeueReusableCell(withIdentifier: "TodoListTableViewCell") as? TodoListTableViewCell else { return UITableViewCell() }
- cell.bind(to: item)
- return cell
- })
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement