|
//
// 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<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 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)
}
}
}
}
|