123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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<Bool>
-
- var path: Interfaces { return .home }
- #warning("user_id 填充")
- var parameter: Parameter = ["user_id": ""]
-
- init() {
- page = 1
- hasMore = true
- loadingSchedule = PublishSubject<Bool>()
- 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<Bool> {
- 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)
- }
- }
- }
- }
|