// // HomePhotoModel.swift // PaiAi // // Created by FFIB on 16/3/31. // Copyright © 2016年 FFIB. All rights reserved. // import Foundation import RxCocoa import RxSwift struct NoMoreDataError: Error {} final class HomePhotoRepository: Resource { fileprivate(set) var items: BehaviorRelay<[PhotoItem]> fileprivate var hasMore: Bool fileprivate var page: Int fileprivate var loadingSchedule: PublishSubject var path: Interfaces { return .home } #warning("user_id 填充") var parameter: Parameter = ["user_id": ""] init() { page = 1 hasMore = true loadingSchedule = PublishSubject() items = BehaviorRelay<[PhotoItem]>(value: []) } } extension HomePhotoRepository: Parsable { typealias Item = [PhotoItem] func parse(_ json: JSON) -> [PhotoItem]? { guard let data = json["data"] as? [String: AnyObject], let left = data["left"] as? Int, let photos = data["photos"] as? [[String: AnyObject]] else { return nil } hasMore = left > 0 return photos.map { return PhotoItem(json: $0) } } } extension HomePhotoRepository: Gettable { func loadContent(isRefresh: Bool) { guard hasMore else { loadingSchedule.onNext(isRefresh) return } self.page = isRefresh ? 1 : self.page + 1 self.parameter["page"] = self.page let request = NetworkApi.share.post(resource: self) { result in defer { self.loadingSchedule.onNext(isRefresh) } guard case let .success(photoItems) = result else { return } if isRefresh { self.items.accept(photoItems) } else { self.items.accept(self.items.value + photoItems) } } } }