No Description

HomeViewModel.swift 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // HomeViewModel.swift
  3. // PaiaiDataKit
  4. //
  5. // Created by FFIB on 2016/12/29.
  6. // Copyright © 2016年 FFIB. All rights reserved.
  7. //
  8. import Foundation
  9. import RxSwift
  10. import RxCocoa
  11. import RxDataSources
  12. public protocol HomeViewModelDelegate: class {
  13. func scanQR()
  14. func createGroup()
  15. func didSelect(_ _items: [PhotoItem], currIndex: Int)
  16. }
  17. public class HomeViewModel {
  18. private var page: Int = 1
  19. private let disposeBag = DisposeBag()
  20. private var repository: HomeRepository
  21. private var _isLoading = PublishSubject<Bool>()
  22. private var _hasMoreData = BehaviorRelay<Bool>(value: true)
  23. private let _items = BehaviorRelay<[PhotoItem]>(value: [])
  24. public var scanBtnTapped = PublishSubject<Void>()
  25. public var createBtnTapped = PublishSubject<Void>()
  26. public var isLoading: Observable<Bool> {
  27. return _isLoading.asObservable()
  28. }
  29. public var hasMoreData: Observable<Bool> {
  30. return _hasMoreData.asObservable()
  31. }
  32. public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> {
  33. return _items.map({ model in
  34. return [AnimatableSectionModel(model: 0, items: model)]
  35. })
  36. }
  37. public weak var delegate: HomeViewModelDelegate?
  38. public init() {
  39. self.repository = HomeRepository()
  40. scanBtnTapped.subscribe({
  41. [weak self] (_) in
  42. guard let `self` = self else { return }
  43. self.delegate?.scanQR()
  44. }).disposed(by: disposeBag)
  45. createBtnTapped.subscribe({
  46. [weak self] (_) in
  47. guard let `self` = self else { return }
  48. self.delegate?.createGroup()
  49. }).disposed(by: disposeBag)
  50. setNotification()
  51. }
  52. public func reload() {
  53. page = 1
  54. repository.load(page: page)
  55. .subscribe(onSuccess: {[weak self] (result) in
  56. guard let `self` = self else { return }
  57. self._isLoading.onNext(true)
  58. self._items.accept(result.data)
  59. self._hasMoreData.accept(result.hasMore)
  60. }, onError: {[weak self] (_) in
  61. guard let `self` = self else { return }
  62. self._isLoading.onNext(true)
  63. }).disposed(by: disposeBag)
  64. }
  65. public func preload() {
  66. guard _hasMoreData.value else { return }
  67. page += 1
  68. repository.load(page: page)
  69. .subscribe(onSuccess: {[weak self] (result) in
  70. guard let `self` = self else { return }
  71. self._isLoading.onNext(false)
  72. self._hasMoreData.accept(result.hasMore)
  73. self._items.accept(self._items.value + result.data)
  74. }, onError: {[weak self] (_) in
  75. guard let `self` = self else { return }
  76. self._isLoading.onNext(false)
  77. }).disposed(by: disposeBag)
  78. }
  79. public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize {
  80. let item = _items.value[indexPath.row]
  81. let w = item.photo_thumbnail_w
  82. let h = item.photo_thumbnail_h
  83. // header 42, footer: 32
  84. return CGSize(width: w, height: h + 74)
  85. }
  86. private func setNotification() {
  87. NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in
  88. guard let itemOperator = notification.userInfo?[GroupItemsOperator.key] as? GroupItemsOperator else { return }
  89. var items = self._items.value
  90. switch itemOperator {
  91. case let .update(id, v):
  92. items = items.map({ (item) -> PhotoItem in
  93. if item.group_id == id {
  94. var tmp = item
  95. tmp.group_name = v.group_name
  96. return tmp
  97. }
  98. return item
  99. })
  100. self._items.accept(items)
  101. break
  102. case let .remove(id):
  103. items.removeAll(where: { $0.group_id == id })
  104. self._items.accept(items)
  105. }
  106. }).disposed(by: disposeBag)
  107. NotificationCenter.default.rx.notification(.PhotoItemsChanged).subscribe(onNext: { (notification) in
  108. guard let itemOperator = notification.userInfo?[PhotoItemsOperator.key] as? PhotoItemsOperator,
  109. case let .update(id, v) = itemOperator,
  110. let index = self._items.value.firstIndex(where: { $0.photo_id == id }) else { return }
  111. var items = self._items.value
  112. items[index] = v
  113. self._items.accept(items)
  114. }).disposed(by: disposeBag)
  115. }
  116. }
  117. //coordinator delegate
  118. extension HomeViewModel {
  119. public func scanQR() {
  120. delegate?.scanQR()
  121. }
  122. public func createGroup() {
  123. delegate?.createGroup()
  124. }
  125. public func didSelect(_ currIndex: Int) {
  126. delegate?.didSelect(_items.value, currIndex: currIndex)
  127. }
  128. }