暫無描述

GroupPhotoRepository.swift 3.5KB

    // // GroupPhotoRepository.swift // PaiAi // // Created by FFIB on 2017/10/10. // Copyright © 2017年 yb. All rights reserved. // import Foundation import RxSwift import RxCocoa public protocol GroupPhotoRepositorable: Repositorable where Content == [PhotoItem] { init(groupId: String) } fileprivate struct PhotoSubmitResource: Resource, Parsable { typealias Model = PhotoItem var path: Interfaces { return .photoUpload } var parameter: Parameter = [:] func parse(_ json: JSON) -> PhotoItem? { guard let data = json["data"] as? [String: AnyObject], let photos = data["photos"] as? [[String: AnyObject]] else { return nil } let dataArr = photos.compactMap { $0 } return PhotoItem(json: dataArr[0]) } } final public class GroupPhotoRepository: Resource { fileprivate var items: BehaviorRelay<[PhotoItem]> fileprivate var loadingSchedule: PublishSubject<Bool> fileprivate var submitResource: PhotoSubmitResource var path: Interfaces { return Interfaces.groupPhotoList } var parameter: Parameter = [:] init() { items = BehaviorRelay<[PhotoItem]>(value: []) loadingSchedule = PublishSubject<Bool>() submitResource = PhotoSubmitResource() } } extension GroupPhotoRepository: Parsable { func parse(_ json: JSON) -> [PhotoItem]? { guard let data = json["data"] as? [String: AnyObject], let photos = data["photos"] as? [[String: AnyObject]] else { return nil } #warning("crash") let dataArr = photos.compactMap { $0 } return dataArr.map { PhotoItem(json: $0) } } } extension GroupPhotoRepository: Gettable { public func loadContent(isRefresh: Bool) { NetworkApi.share.post(resource: self) { (result) in guard case let .success(items) = result else { return } self.items.accept(items) self.loadingSchedule.onNext(true) } } } extension GroupPhotoRepository: GroupPhotoRepositorable { 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() } public convenience init(groupId: String) { self.init() parameter["group_id"] = groupId parameter["user_id"] = "" submitResource.parameter = ["group_id": groupId, "user_id": ""] } } extension GroupPhotoRepository: Submitable { public func submit(data: Data) { let name = (submitResource.parameter["group_id"] as? String) ?? "" + "" + "\(Date.timeIntervalSinceReferenceDate)" let file = FileModel(name: name, fileData: data) submitResource.parameter["photo"] = file NetworkApi.share.upload(resource: submitResource) { (result) in guard case let .success(item) = result else { return } self.items.accept([item] + self.items.value) self.loadingSchedule.onNext(true) } } } extension GroupPhotoRepository: 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) } }