Guest User

Untitled

a guest
Jun 20th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. import UIKit
  2. import RxSwift
  3. import RxCocoa
  4. import RxSwiftExt
  5.  
  6. struct Todo: CustomStringConvertible {
  7. let title: String
  8. var isCompleted: Bool
  9. var isFavorited: Bool
  10.  
  11. var description: String {
  12. return "\(title) com: \(isCompleted) fav: \(isFavorited)"
  13. }
  14. }
  15.  
  16. class Service {
  17.  
  18. func getTodos() -> Observable<[Todo]> {
  19. return Observable
  20. .just([
  21. Todo(title: "todo1", isCompleted: false, isFavorited: false),
  22. Todo(title: "todo2", isCompleted: true, isFavorited: false)
  23. ])
  24. .delaySubscription(0.1, scheduler: MainScheduler.instance)
  25. }
  26. }
  27.  
  28. class ViewController: UIViewController {
  29.  
  30. private let disposeBag = DisposeBag()
  31. private let service = Service.init()
  32.  
  33. // output
  34. let todos = PublishSubject<[Todo]>()
  35.  
  36. // from api/service
  37. var todosFromService: Observable<[Todo]>!
  38.  
  39. // inputs
  40. let toggleCompleted = PublishSubject<String>()
  41. let toggleFavorited = PublishSubject<String>()
  42.  
  43. // load data from service
  44. let loadData = PublishSubject<Void>()
  45.  
  46. init() {
  47. super.init(nibName: nil, bundle: nil)
  48.  
  49. todosFromService = loadData.flatMap { [unowned self] in return self.service.getTodos() }
  50. let completedToggled = toggleCompleted.withLatestFrom(todos) { withTodoCompleted(title: $0, in: $1) }
  51. let favoritedToggled = toggleFavorited.withLatestFrom(todos) { withTodoFavorited(title: $0, in: $1) }
  52.  
  53. todosFromService.bind(to: todos)
  54. completedToggled.bind(to: todos)
  55. favoritedToggled.bind(to: todos)
  56.  
  57. todos
  58. .debug("new todos", trimOutput: false)
  59. .subscribe(onNext: { t in
  60.  
  61. })
  62. .disposed(by: disposeBag)
  63. }
  64.  
  65. required init?(coder aDecoder: NSCoder) {
  66. fatalError("init(coder:) has not been implemented")
  67. }
  68.  
  69. override func viewDidLoad() {
  70. super.viewDidLoad()
  71.  
  72. view.backgroundColor = .orange
  73.  
  74. // add test buttons
  75. let b1 = UIButton()
  76. b1.setTitle("toggle completed", for: .normal)
  77. b1.addTarget(self, action: #selector(toggleButton), for: .touchUpInside)
  78. let b2 = UIButton()
  79. b2.setTitle("toggle favorited", for: .normal)
  80. b2.addTarget(self, action: #selector(favButton), for: .touchUpInside)
  81. let sv = UIStackView(arrangedSubviews: [b1,b2])
  82. sv.axis = .vertical
  83. sv.translatesAutoresizingMaskIntoConstraints = false
  84. view.addSubview(sv)
  85. sv.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
  86. sv.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
  87. }
  88.  
  89. @objc func toggleButton() {
  90. toggleCompleted.onNext("todo1")
  91. }
  92. @objc func favButton() {
  93. toggleFavorited.onNext("todo1")
  94. }
  95.  
  96.  
  97.  
  98. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  99. loadData.onNext(())
  100. }
  101. }
  102.  
  103.  
  104. func withTodoCompleted(title: String, in todos: [Todo]) -> [Todo] {
  105.  
  106. func toggle(todo: Todo) -> Todo {
  107. var todo = todo
  108. todo.isCompleted = !todo.isCompleted
  109. return todo
  110. }
  111.  
  112. return todos.map { $0.title == title ? toggle(todo: $0) : $0 }
  113. }
  114.  
  115. func withTodoFavorited(title: String, in todos: [Todo]) -> [Todo] {
  116.  
  117. func toggle(todo: Todo) -> Todo {
  118. var todo = todo
  119. todo.isFavorited = !todo.isFavorited
  120. return todo
  121. }
  122.  
  123. return todos.map { $0.title == title ? toggle(todo: $0) : $0 }
  124. }
Add Comment
Please, Sign In to add comment