No Description

OrderModelRepository.swift 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //
  2. // OrderRepository.swift
  3. // PaiAi
  4. //
  5. // Created by zhengjianfei on 16/4/7.
  6. // Copyright © 2016年 FFIB. All rights reserved.
  7. //
  8. import Foundation
  9. import RxSwift
  10. import RxCocoa
  11. public protocol OrderRepositorable: Repositorable where Content == OrderItem {}
  12. final public class OrderModelRepository {
  13. fileprivate var items: BehaviorRelay<[OrderItem]>
  14. fileprivate var hasMore = true
  15. fileprivate var page = 1
  16. fileprivate var contentsResource: Resource<[OrderItem]>?
  17. }
  18. public protocol OrderRepository: Repositorable where Content == [PhotoItem] {}
  19. final public class HomePhotoRepository: Resource {
  20. fileprivate var items: BehaviorRelay<[PhotoItem]>
  21. fileprivate var hasMore: Bool
  22. fileprivate var page: Int
  23. fileprivate var loadingSchedule: PublishSubject<Bool>
  24. var path: Interfaces { return .home }
  25. #warning("user_id 填充")
  26. var parameter: Parameter = ["user_id": ""]
  27. init() {
  28. page = 1
  29. hasMore = true
  30. loadingSchedule = PublishSubject<Bool>()
  31. items = BehaviorRelay<[PhotoItem]>(value: [])
  32. }
  33. }
  34. extension HomePhotoRepository: Parsable {
  35. typealias Model = [PhotoItem]
  36. func parse(_ json: JSON) -> [PhotoItem]? {
  37. guard let data = json["data"] as? [String: AnyObject],
  38. let left = data["left"] as? Int,
  39. let photos = data["photos"] as? [[String: AnyObject]] else {
  40. return nil
  41. }
  42. hasMore = left > 0
  43. return photos.map { return PhotoItem(json: $0) }
  44. }
  45. }
  46. extension HomePhotoRepository: Gettable {
  47. public func loadContent(isRefresh: Bool) {
  48. guard hasMore else {
  49. loadingSchedule.onNext(isRefresh)
  50. return
  51. }
  52. page = isRefresh ? 1 : page + 1
  53. parameter["page"] = page
  54. let _ = NetworkApi.share.post(resource: self) { result in
  55. defer { self.loadingSchedule.onNext(isRefresh) }
  56. guard case let .success(photoItems) = result else {
  57. return
  58. }
  59. if isRefresh {
  60. self.items.accept(photoItems)
  61. } else {
  62. self.items.accept(self.items.value + photoItems)
  63. }
  64. }
  65. }
  66. }
  67. extension HomePhotoRepository: HomePhotoRepositorable {
  68. public var content: Observable<[PhotoItem]> {
  69. return items.asObservable()
  70. .flatMap { currentItems in
  71. Observable.just(currentItems)
  72. .distinctUntilChanged()
  73. }.share()
  74. }
  75. public var loadingObserver: Observable<Bool> {
  76. return loadingSchedule.asObserver()
  77. .flatMap { current in
  78. Observable.just(current)
  79. }.share()
  80. }
  81. }
  82. extension HomePhotoRepository: Layoutable {
  83. public func layoutSizeForIndex(_ index: Int) -> CGSize {
  84. let h = items.value[index].photo_thumbnail_h
  85. let w = items.value[index].photo_thumbnail_w
  86. return CGSize(width: w, height: h)
  87. }
  88. }
  89. final class OrderModel {
  90. init() {
  91. items = BehaviorRelay<[OrderItem]>(value: [])
  92. contentsResource = Resource(url: .orderList,
  93. param: ["user_id": SharedUserInfo.userId as AnyObject],
  94. parse: parse)
  95. }
  96. private func parse(json: [String: AnyObject]) -> [OrderItem]? {
  97. guard let data = json["data"],
  98. let orders = data["orders"] as? [[String: AnyObject]],
  99. let left = data["left"] as? Int else { return nil }
  100. hasMore = left > 0
  101. return orders.map { return OrderItem(json: $0) }
  102. }
  103. func loadContents(isRefresh: Bool) {
  104. guard hasMore else { return }
  105. page = isRefresh ? 1 : page + 1
  106. contentsResource?.parameter["page"] = page as AnyObject
  107. NetworkApi.share.post(resource: contentsResource!) { [weak self] result in
  108. guard case let .success(orderItems) = result else { return }
  109. guard let `self` = self else { return }
  110. if isRefresh {
  111. self.items.accept(orderItems)
  112. } else {
  113. self.items.accept(orderItems + self.items.value)
  114. }
  115. }
  116. }
  117. }