Нет описания

MineGroupViewModel.swift 4.1KB

    // // MineGroupViewModel.swift // PaiaiDataKit // // Created by FFIB on 2017/5/8. // Copyright © 2017年 FFIB. All rights reserved. // import Foundation import RxSwift import RxCocoa import RxDataSources public protocol MineGroupViewModelDelegate: class { func didSelect(_ item: GroupItem) } public class MineGroupViewModel { private let repository: GroupRepository 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 let _items = BehaviorRelay<[GroupItem]>(value: []) public weak var delegate: MineGroupViewModelDelegate? 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, GroupItem>]> { return _items.map({ model in return [AnimatableSectionModel(model: 0, items: model)] }) } public init() { self.repository = PhotoGroupRepository() setNotification() } public func reload() { page = 1 repository.load(page: page) .asDriver(onErrorJustReturn: NetworkArrayData<GroupItem>.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.load(page: page) .asDriver(onErrorJustReturn: NetworkArrayData<GroupItem>.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(groupId: _items.value[index].group_id) .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) } private func setNotification() { NotificationCenter.default.rx.notification(.GroupItemsChanged).subscribe(onNext: { (notification) in guard let userInfo = notification.userInfo, let itemOperator = userInfo[GroupItemsOperator.key] as? GroupItemsOperator else { return } switch itemOperator { case let .update(groupId, val): guard let index = self._items.value.firstIndex(where: { $0.group_id == groupId }) else { return } var items = self._items.value items[index] = val self._items.accept(items) case let .remove(groupId): var items = self._items.value items.removeAll(where: { $0.group_id == groupId }) self._items.accept(items) } }).disposed(by: disposeBag) } } /// ViewModel delegate public extension MineGroupViewModel { func didSelect(_ item: GroupItem) { delegate?.didSelect(item) } }