No Description

MessageListViewModel.swift 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 var messageReaded = BehaviorRelay<Bool>(value: false)
  26. public weak var delegate: MessageListViewModelDelegate?
  27. public var isEmpty: Observable<Bool> {
  28. return _isEmpty.asObservable()
  29. }
  30. public var hasMoreData: Observable<Bool> {
  31. return _hasMoreData.asObservable()
  32. }
  33. public var isLoading: Observable<Bool> {
  34. return _isLoading.asObserver()
  35. }
  36. public var showMessage: Observable<String> {
  37. return _showMessage.asObservable()
  38. }
  39. public var contents: Observable<[AnimatableSectionModel<Int, MessageListItem>]> {
  40. return items.map({ model in
  41. return [AnimatableSectionModel(model: 0, items: model)]
  42. })
  43. }
  44. public init(type: MessageType) {
  45. self.repository = MessageRepository()
  46. self.type = type
  47. readed()
  48. }
  49. public func reload() {
  50. page = 1
  51. repository.loadMessageList(type, page: page)
  52. .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
  53. .drive(onNext: {[weak self] (model) in
  54. guard let `self` = self else { return }
  55. self._hasMoreData.onNext(model.hasMore)
  56. self._isEmpty.accept(!model.data.isEmpty)
  57. self.items.accept(model.data)
  58. }, onDisposed: {[weak self] in
  59. guard let `self` = self else { return }
  60. self._isLoading.onNext(true)
  61. }).disposed(by: disposeBag)
  62. }
  63. public func preload() {
  64. page += 1
  65. repository.loadMessageList(type, page: page)
  66. .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
  67. .drive(onNext: {[weak self] (model) in
  68. guard let `self` = self else { return }
  69. self._hasMoreData.onNext(model.hasMore)
  70. self.items.accept(self.items.value + model.data)
  71. }, onDisposed: {[weak self] in
  72. guard let `self` = self else { return }
  73. self._isLoading.onNext(false)
  74. }).disposed(by: disposeBag)
  75. }
  76. public func remove(of index: Int) {
  77. Toast.showActivity(message: "正在删除这条消息")
  78. repository.remove(type, pk: items.value[index].pk)
  79. .subscribe(onCompleted: {[weak self] in
  80. guard let `self` = self else { return }
  81. var _items = self.items.value
  82. _items.remove(at: index)
  83. self.items.accept(_items)
  84. self._showMessage.onNext("消息删除")
  85. }).disposed(by: disposeBag)
  86. }
  87. public func removeAll() {
  88. Toast.showActivity(message: "正在删除全部消息")
  89. repository.removeAll(type)
  90. .subscribe(onCompleted: {[weak self] in
  91. guard let `self` = self else { return }
  92. self.items.accept([])
  93. self._isEmpty.accept(false)
  94. self._showMessage.onNext("消息已清空")
  95. }).disposed(by: disposeBag)
  96. }
  97. public func readed() {
  98. repository.readed(type).subscribe(onCompleted: {
  99. self.messageReaded.accept(false)
  100. }).disposed(by: disposeBag)
  101. }
  102. public func didSelect(item: MessageListItem) {
  103. delegate?.didSelect(item: item)
  104. }
  105. }