Нет описания

GroupViewModel.swift 2.4KB

    // // GroupViewModel.swift // PaiAi // // Created by zhengjianfei on 2017/1/4. // Copyright © 2017年 FFIB. All rights reserved. // import UIKit import RxSwift import RxCocoa import RxDataSources public protocol GroupViewModelDelegate: class { func didSelect(_ item: PhotoItem) func navigateToGroupDetail() } public class GroupViewModel { private let disposeBag = DisposeBag() private var respository: GroupPhotoRepository private var _isLoading = PublishSubject<Void>() private let items = BehaviorRelay<[PhotoItem]>(value: []) public var isLoading: Observable<Void> { return _isLoading.asObservable() } public var contents: Observable<[AnimatableSectionModel<Int, PhotoItem>]> { return items.map({ model in return [AnimatableSectionModel(model: 0, items: model)] }) } public weak var delegate: GroupViewModelDelegate? public init(groupItem: GroupItem) { self.respository = GroupPhotoRepository(groupId: groupItem.group_id) } public func reload() { respository.load() .subscribe(onSuccess: {[weak self] (result) in guard let `self` = self else { return } self._isLoading.onNext(()) self.items.accept(result) }, onError: {[weak self] (error) in guard let `self` = self else { return } self._isLoading.onNext(()) }).disposed(by: disposeBag) } public func submit(data: Data) { respository.upload(data: data).subscribe(onSuccess: { [weak self] result in guard let `self` = self else { return } self.items.accept(result) self._isLoading.onNext(()) }) {[weak self] (error) in guard let `self` = self else { return } self._isLoading.onNext(()) }.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) } } /// GroupViewModelDelegate public extension GroupViewModel { func didSelect(_ item: PhotoItem) { delegate?.didSelect(item) } @objc func navigateToGroupDetail() { delegate?.navigateToGroupDetail() } }