123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import Foundation
- import RxSwift
- import RxCocoa
- import RxDataSources
- public protocol MessageListViewModelDelegate: class {
- func didSelect(item: MessageListItem)
- }
- public class MessageListViewModel {
-
- private let repository: MessageRepository
- private let type: MessageType
- private var disposeBag = DisposeBag()
- private var page = 1
-
- private var _isLoading = PublishSubject<Bool>()
- private var _isEmpty = BehaviorRelay<Bool>(value: false)
- private var _hasMoreData = PublishSubject<Bool>()
- private var _showMessage = PublishSubject<String>()
- private var items = BehaviorRelay<[MessageListItem]>(value: [])
-
- public var messageReaded = BehaviorRelay<Bool>(value: false)
-
- public weak var delegate: MessageListViewModelDelegate?
-
- public var isEmpty: Observable<Bool> {
- return _isEmpty.asObservable()
- }
-
- public var hasMoreData: Observable<Bool> {
- return _hasMoreData.asObservable()
- }
-
- public var isLoading: Observable<Bool> {
- return _isLoading.asObserver()
- }
-
- public var showMessage: Observable<String> {
- return _showMessage.asObservable()
- }
-
- public var contents: Observable<[AnimatableSectionModel<Int, MessageListItem>]> {
- return items.map({ model in
- return [AnimatableSectionModel(model: 0, items: model)]
- })
- }
-
- public init(type: MessageType) {
- self.repository = MessageRepository()
- self.type = type
-
- readed()
- }
-
- public func reload() {
- page = 1
- repository.loadMessageList(type, page: page)
- .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
- .drive(onNext: {[weak self] (model) in
- guard let `self` = self else { return }
- self._hasMoreData.onNext(model.hasMore)
- self._isEmpty.accept(!model.data.isEmpty)
- self.items.accept(model.data)
- }, onDisposed: {[weak self] in
- guard let `self` = self else { return }
- self._isLoading.onNext(true)
- }).disposed(by: disposeBag)
- }
-
- public func preload() {
- page += 1
-
- repository.loadMessageList(type, page: page)
- .asDriver(onErrorJustReturn: NetworkArrayData<MessageListItem>.empty())
- .drive(onNext: {[weak self] (model) in
- guard let `self` = self else { return }
- self._hasMoreData.onNext(model.hasMore)
- self.items.accept(self.items.value + model.data)
- }, onDisposed: {[weak self] in
- guard let `self` = self else { return }
- self._isLoading.onNext(false)
- }).disposed(by: disposeBag)
- }
-
- public func remove(of index: Int) {
- Toast.showActivity(message: "正在删除这条消息")
- repository.remove(type, pk: items.value[index].pk)
- .subscribe(onCompleted: {[weak self] in
- guard let `self` = self else { return }
- var _items = self.items.value
- _items.remove(at: index)
- self.items.accept(_items)
- self._showMessage.onNext("消息删除")
- }).disposed(by: disposeBag)
- }
-
- public func removeAll() {
- Toast.showActivity(message: "正在删除全部消息")
- repository.removeAll(type)
- .subscribe(onCompleted: {[weak self] in
- guard let `self` = self else { return }
- self.items.accept([])
- self._isEmpty.accept(false)
- self._showMessage.onNext("消息已清空")
- }).disposed(by: disposeBag)
- }
-
- public func readed() {
- repository.readed(type).subscribe(onCompleted: {
- self.messageReaded.accept(false)
- }).disposed(by: disposeBag)
- }
-
- public func didSelect(item: MessageListItem) {
- delegate?.didSelect(item: item)
- }
- }
|