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: [])
- 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) }
- }
- 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) }
- }
- 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])
- }
- }
- // 1
- var todoSelectedObserver: AnyObserver<TodoListCellViewModel> {
- return AnyObserver {
- guard
- let element = $0.element,
- let selectedViewModel = self.todoListCellViewModelsBehaviorRelay.value.first(where: { viewModel -> Bool in
- viewModel === element
- })
- else { return }
- selectedViewModel.updateTodoStatusObserver.onNext(())
- self.todoListCellViewModelsBehaviorRelay.accept(self.todoListCellViewModelsBehaviorRelay.value)
- }
- }
- var todoListSectionsObservable: Observable<[TodoListSection]> {
- return Observable
- .combineLatest(notStartedSectionObservable, startedSectionObserverable, finishedSectionObservable)
- .map { [$0, $1, $2] }
- }
- 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
- })
- init() {
- dataSource.titleForHeaderInSection = { dataSource, index in
- return dataSource.sectionModels[index].header
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement