Bark/Common/Moya/BarkTargetType.swift

116 lines
3.4 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// BarkTargetType.swift
// Bark
//
// Created by huangfeng on 2018/6/25.
// Copyright © 2018 Fin. All rights reserved.
//
import Moya
import RxSwift
import UIKit
// Providers
private var retainProviders: [String: Any] = [:]
protocol BarkTargetType: TargetType {
var parameters: [String: Any]? { get }
}
extension BarkTargetType {
var headers: [String: String]? {
return nil
}
var baseURL: URL {
return URL(string: ServerManager.shared.currentServer.address)!
}
var method: Moya.Method {
return .get
}
var parameterEncoding: ParameterEncoding {
return URLEncoding.default
}
var sampleData: Data {
return Data()
}
var task: Task {
return requestTaskWithParameters
}
var requestTaskWithParameters: Task {
//
var defaultParameters: [String: Any] = [:]
//
if let parameters = self.parameters {
for (key, value) in parameters {
defaultParameters[key] = value
}
}
return Task.requestParameters(parameters: defaultParameters, encoding: parameterEncoding)
}
/// provider
static var provider: RxSwift.Reactive<MoyaProvider<Self>> {
let key = "\(Self.self)"
if let provider = retainProviders[key] as? RxSwift.Reactive<MoyaProvider<Self>> {
return provider
}
let provider = Self.weakProvider
retainProviders[key] = provider
return provider
}
/// Provider 使
static var weakProvider: RxSwift.Reactive<MoyaProvider<Self>> {
var plugins: [PluginType] = []
#if DEBUG
plugins.append(LogPlugin())
#endif
let provider = MoyaProvider<Self>(plugins: plugins)
return provider.rx
}
}
public extension RxSwift.Reactive where Base: MoyaProviderType {
func request(_ token: Base.Target, callbackQueue: DispatchQueue? = nil) -> Observable<Response> {
return Single.create { [weak base] single in
let cancellableToken = base?.request(token, callbackQueue: callbackQueue, progress: nil) { result in
switch result {
case let .success(response):
single(.success(response))
case let .failure(error):
single(.failure(error))
}
}
return Disposables.create {
cancellableToken?.cancel()
}
}.asObservable()
}
}
private class LogPlugin: PluginType {
func willSend(_ request: RequestType, target: TargetType) {
print("\n-------------------\n准备请求: \(target.path)")
print("请求方式: \(target.method.rawValue)")
if let params = (target as? BarkTargetType)?.parameters {
print(params)
}
print("\n")
}
func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {
print("\n-------------------\n请求结束: \(target.path)")
if let data = try? result.get().data, let resutl = String(data: data, encoding: String.Encoding.utf8) {
print("请求结果: \(resutl)")
}
print("\n")
}
}