No Description

MessageListViewModel.swift 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //
  2. // MessageListViewModel.swift
  3. // PaiAi
  4. //
  5. // Created by mac on 2016/10/19.
  6. // Copyright © 2016年 FFIB. All rights reserved.
  7. //
  8. import Foundation
  9. import RxSwift
  10. import RxCocoa
  11. import RxDataSources
  12. public protocol MessageListViewModelDelegate: class {
  13. func didSelect(item: MessageListItem)
  14. }
  15. public class MessageListViewModel {
  16. private let repository: MessageRepository
  17. private let type: MessageType
  18. private var disposeBag = DisposeBag()
  19. private var page = 1
  20. private var _isLoading = PublishSubject<Bool>()
  21. private var _isEmpty = BehaviorRelay<Bool>(value: false)
  22. private var _hasMoreData = PublishSubject<Bool>()
  23. private var _showMessage = PublishSubject<String>()
  24. private var items = BehaviorRelay<[MessageListItem]>(value: [])
  25. public weak var delegate: MessageListViewModelDelegate?
  26. public var isEmpty: Observable<Bool> {
  27. return _isEmpty.asObservable()
  28. }
  29. public var hasMoreData: Observable<Bool> {
  30. return _hasMoreData.asObservable()
  31. }
  32. public var isLoading: Observable<Bool> {
  33. return _isLoading.asObserver()
  34. }
  35. public var showMessage: Observable<String> {
  36. return _showMessage.asObservable()
  37. }
  38. public var contents: Observable<[AnimatableSectionModel<Int, MessageListItem>]> {
  39. return items.map({ model in
  40. return [AnimatableSectionModel(model: 0, items: model)]
  41. })
  42. }
  43. public init(type: MessageType) {
  44. self.repository = MessageRepository()
  45. self.type = type
  46. }
  47. public func reload() {
  48. page = 1
  49. repository.loadMessageList(type, page: page)
  50. .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
  51. .drive(onNext: {[weak self] (model) in
  52. guard let `self` = self else { return }
  53. self._hasMoreData.onNext(model.hasMore)
  54. self._isEmpty.accept(!model.data.isEmpty)
  55. self.items.accept(model.data)
  56. }, onDisposed: {[weak self] in
  57. guard let `self` = self else { return }
  58. self._isLoading.onNext(true)
  59. }).disposed(by: disposeBag)
  60. }
  61. public func preload() {
  62. page += 1
  63. repository.loadMessageList(type, page: page)
  64. .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
  65. .drive(onNext: {[weak self] (model) in
  66. guard let `self` = self else { return }
  67. self._hasMoreData.onNext(model.hasMore)
  68. self.items.accept(self.items.value + model.data)
  69. }, onDisposed: {[weak self] in
  70. guard let `self` = self else { return }
  71. self._isLoading.onNext(false)
  72. }).disposed(by: disposeBag)
  73. }
  74. public func remove(of index: Int) {
  75. repository.remove(type, pk: items.value[index].pk)
  76. .subscribe(onCompleted: {[weak self] in
  77. guard let `self` = self else { return }
  78. var _items = self.items.value
  79. _items.remove(at: index)
  80. self.items.accept(_items)
  81. self._showMessage.onNext("删除成功")
  82. }) { (error) in
  83. guard let error = error as? InteractionError else {
  84. return
  85. }
  86. self._showMessage.onNext(error.errMessage)
  87. }.disposed(by: disposeBag)
  88. }
  89. public func removeAll() {
  90. repository.removeAll(type)
  91. .subscribe(onCompleted: {[weak self] in
  92. guard let `self` = self else { return }
  93. self.items.accept([])
  94. self._showMessage.onNext("删除成功")
  95. }) { (error) in
  96. guard let error = error as? InteractionError else {
  97. return
  98. }
  99. self._showMessage.onNext(error.errMessage)
  100. }.disposed(by: disposeBag)
  101. }
  102. public func readed() {
  103. }
  104. public func didSelect(item: MessageListItem) {
  105. delegate?.didSelect(item: item)
  106. }
  107. }