暂无描述

MessageListViewModel.swift 4.0KB

    // // MessageListViewModel.swift // PaiaiDataKit // // Created by FFIB on 2016/10/19. // Copyright © 2016年 FFIB. All rights reserved. // 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) } }