説明なし

HomeViewModel.swift 3.4KB

    // // HomeViewModel.swift // PaiAi // // Created by zhengjianfei on 2016/12/29. // Copyright © 2016年 FFIB. All rights reserved. // import Foundation import RxSwift import RxCocoa import RxDataSources public protocol HomeViewModelDelegate: class { func scanQR() func createGroup() func didSelect(_ item: PhotoItem) } public class HomeViewModel { private var page: Int = 1 private let disposeBag = DisposeBag() private var respository: PhotoRepository private var _isLoading = PublishSubject<Bool>() private var _hasMoreData = BehaviorRelay<Bool>(value: true) private let items = BehaviorRelay<[PhotoItem]>(value: []) public var scanBtnTapped = PublishSubject<Void>() public var createBtnTapped = PublishSubject<Void>() public var isLoading: Observable<Bool> { return _isLoading.asObservable() } public var hasMoreData: Observable<Bool> { return _hasMoreData.asObservable() } public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> { return items.map({ model in return [AnimatableSectionModel(model: 0, items: model)] }) } public weak var delegate: HomeViewModelDelegate? public init() { self.respository = HomePhotoRepository() scanBtnTapped.subscribe({ [weak self] (_) in guard let `self` = self else { return } self.delegate?.scanQR() }).disposed(by: disposeBag) createBtnTapped.subscribe({ [weak self] (_) in guard let `self` = self else { return } self.delegate?.createGroup() }).disposed(by: disposeBag) } public func reload() { page = 1 respository.load(page: page) .subscribe(onSuccess: {[weak self] (result) in guard let `self` = self else { return } self._isLoading.onNext(true) self.items.accept(result.data) self._hasMoreData.accept(result.hasMore) }, onError: {[weak self] (_) in guard let `self` = self else { return } self._isLoading.onNext(true) }).disposed(by: disposeBag) } public func preload() { guard _hasMoreData.value else { return } page += 1 respository.load(page: page) .subscribe(onSuccess: {[weak self] (result) in guard let `self` = self else { return } self._isLoading.onNext(false) self._hasMoreData.accept(result.hasMore) self.items.accept(self.items.value + result.data) }, onError: {[weak self] (_) in guard let `self` = self else { return } self._isLoading.onNext(false) }).disposed(by: disposeBag) } public func layoutSizeForIndexPath(_ indexPath: IndexPath) -> CGSize { let item = items.value[indexPath.row] let w = item.photo_thumbnail_w let h = item.photo_thumbnail_h // header 42, footer: 32 return CGSize(width: w, height: h + 74) } } //coordinator delegate extension HomeViewModel { public func scanQR() { delegate?.scanQR() } public func createGroup() { delegate?.createGroup() } public func didSelect(_ item: PhotoItem) { delegate?.didSelect(item) } }