Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import UIKit
- import RxSwift
- import RxCocoa
- import RxSwiftExt
- struct Todo: CustomStringConvertible {
- let title: String
- var isCompleted: Bool
- var isFavorited: Bool
- var description: String {
- return "\(title) com: \(isCompleted) fav: \(isFavorited)"
- }
- }
- class Service {
- func getTodos() -> Observable<[Todo]> {
- return Observable
- .just([
- Todo(title: "todo1", isCompleted: false, isFavorited: false),
- Todo(title: "todo2", isCompleted: true, isFavorited: false)
- ])
- .delaySubscription(0.1, scheduler: MainScheduler.instance)
- }
- }
- class ViewController: UIViewController {
- private let disposeBag = DisposeBag()
- private let service = Service.init()
- // output
- let todos = PublishSubject<[Todo]>()
- // from api/service
- var todosFromService: Observable<[Todo]>!
- // inputs
- let toggleCompleted = PublishSubject<String>()
- let toggleFavorited = PublishSubject<String>()
- // load data from service
- let loadData = PublishSubject<Void>()
- init() {
- super.init(nibName: nil, bundle: nil)
- todosFromService = loadData.flatMap { [unowned self] in return self.service.getTodos() }
- let completedToggled = toggleCompleted.withLatestFrom(todos) { withTodoCompleted(title: $0, in: $1) }
- let favoritedToggled = toggleFavorited.withLatestFrom(todos) { withTodoFavorited(title: $0, in: $1) }
- todosFromService.bind(to: todos)
- completedToggled.bind(to: todos)
- favoritedToggled.bind(to: todos)
- todos
- .debug("new todos", trimOutput: false)
- .subscribe(onNext: { t in
- })
- .disposed(by: disposeBag)
- }
- required init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- view.backgroundColor = .orange
- // add test buttons
- let b1 = UIButton()
- b1.setTitle("toggle completed", for: .normal)
- b1.addTarget(self, action: #selector(toggleButton), for: .touchUpInside)
- let b2 = UIButton()
- b2.setTitle("toggle favorited", for: .normal)
- b2.addTarget(self, action: #selector(favButton), for: .touchUpInside)
- let sv = UIStackView(arrangedSubviews: [b1,b2])
- sv.axis = .vertical
- sv.translatesAutoresizingMaskIntoConstraints = false
- view.addSubview(sv)
- sv.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
- sv.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
- }
- @objc func toggleButton() {
- toggleCompleted.onNext("todo1")
- }
- @objc func favButton() {
- toggleFavorited.onNext("todo1")
- }
- override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
- loadData.onNext(())
- }
- }
- func withTodoCompleted(title: String, in todos: [Todo]) -> [Todo] {
- func toggle(todo: Todo) -> Todo {
- var todo = todo
- todo.isCompleted = !todo.isCompleted
- return todo
- }
- return todos.map { $0.title == title ? toggle(todo: $0) : $0 }
- }
- func withTodoFavorited(title: String, in todos: [Todo]) -> [Todo] {
- func toggle(todo: Todo) -> Todo {
- var todo = todo
- todo.isFavorited = !todo.isFavorited
- return todo
- }
- return todos.map { $0.title == title ? toggle(todo: $0) : $0 }
- }
Add Comment
Please, Sign In to add comment