Nav apraksta

GroupRepository.swift 3.6KB

    // // GroupRepository.swift // PaiAi // // Created by FFIB on 16/4/1. // Copyright © 2016年 FFIB. All rights reserved. // import Foundation import RxCocoa import RxSwift fileprivate struct GroupDeleteResource: Resource { var path: Interfaces { return .groupDelete } #warning("user_id 填充") var parameter: Parameter = ["user_id": ""] } extension GroupDeleteResource: Parsable { typealias Model = StatusModel func parse(_ json: JSON) -> StatusModel? { return StatusModel(json: json) } } public protocol GroupRepositorable: Repositorable where Content == [GroupItem] {} final public class GroupRepository: Resource { fileprivate var items: BehaviorRelay<[GroupItem]> fileprivate var hasMore: Bool fileprivate var page: Int fileprivate var loadingSchedule: PublishSubject<Bool> var path: Interfaces { return .groupList } #warning("admin_id 填充") var parameter: Parameter = ["admin_id": ""] fileprivate var deleteResource: GroupDeleteResource init() { page = 1 hasMore = true loadingSchedule = PublishSubject<Bool>() items = BehaviorRelay<[GroupItem]>(value: []) deleteResource = GroupDeleteResource() } } extension GroupRepository: Parsable { typealias Model = [GroupItem] func parse(_ json: JSON) -> [GroupItem]? { guard let data = json["data"] as? [String: AnyObject], let messages = data["groups"] as? [[String: AnyObject]], let left = data["left"] as? Int else { return nil } hasMore = left > 0 return messages.map { return GroupItem(json: $0) } } } extension GroupRepository: 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(items) = result else { return } if isRefresh { self.items.accept(items) } else { self.items.accept(self.items.value + items) } } } } extension GroupRepository: Deletable { public func remove(of index: Int) { let item = items.value[index] deleteResource.parameter["group_id"] = item.group_id NetworkApi.share.post(resource: deleteResource) { [weak self] result in guard case let .success(statusModel) = result else { return } guard let `self` = self else { return } if statusModel.status == 200 { var values = self.items.value values.remove(at: index) self.items.accept(values) } else if statusModel.status == 402010 { #warning("无权限") } else if statusModel.status == 402099 { #warning("无权限") } } } } extension GroupRepository: GroupRepositorable { public var content: Observable<[GroupItem]> { 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() } }