// // OrderRepository.swift // PaiAi // // Created by zhengjianfei on 16/4/7. // Copyright © 2016年 FFIB. All rights reserved. // import Foundation import RxSwift import RxCocoa public protocol OrderRepositorable: Repositorable where Content == OrderItem {} final public class OrderModelRepository { fileprivate var items: BehaviorRelay<[OrderItem]> fileprivate var hasMore = true fileprivate var page = 1 fileprivate var contentsResource: Resource<[OrderItem]>? } public protocol OrderRepository: Repositorable where Content == [PhotoItem] {} final public class HomePhotoRepository: Resource { fileprivate 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 Model = [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 { public func loadContent(isRefresh: Bool) { guard hasMore else { loadingSchedule.onNext(isRefresh) return } page = isRefresh ? 1 : page + 1 parameter["page"] = page let _ = 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) } } } } extension HomePhotoRepository: HomePhotoRepositorable { public var content: Observable<[PhotoItem]> { return items.asObservable() .flatMap { currentItems in Observable.just(currentItems) .distinctUntilChanged() }.share() } public var loadingObserver: Observable { return loadingSchedule.asObserver() .flatMap { current in Observable.just(current) }.share() } } extension HomePhotoRepository: Layoutable { public func layoutSizeForIndex(_ index: Int) -> CGSize { let h = items.value[index].photo_thumbnail_h let w = items.value[index].photo_thumbnail_w return CGSize(width: w, height: h) } } final class OrderModel { init() { items = BehaviorRelay<[OrderItem]>(value: []) contentsResource = Resource(url: .orderList, param: ["user_id": SharedUserInfo.userId as AnyObject], parse: parse) } private func parse(json: [String: AnyObject]) -> [OrderItem]? { guard let data = json["data"], let orders = data["orders"] as? [[String: AnyObject]], let left = data["left"] as? Int else { return nil } hasMore = left > 0 return orders.map { return OrderItem(json: $0) } } func loadContents(isRefresh: Bool) { guard hasMore else { return } page = isRefresh ? 1 : page + 1 contentsResource?.parameter["page"] = page as AnyObject NetworkApi.share.post(resource: contentsResource!) { [weak self] result in guard case let .success(orderItems) = result else { return } guard let `self` = self else { return } if isRefresh { self.items.accept(orderItems) } else { self.items.accept(orderItems + self.items.value) } } } }