BarkTargetType.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // BarkTargetType.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2018/6/25.
  6. // Copyright © 2018 Fin. All rights reserved.
  7. //
  8. import Moya
  9. import RxSwift
  10. import UIKit
  11. // 保存全局Providers
  12. private var retainProviders: [String: Any] = [:]
  13. protocol BarkTargetType: TargetType {
  14. var parameters: [String: Any]? { get }
  15. }
  16. extension BarkTargetType {
  17. var headers: [String: String]? {
  18. return nil
  19. }
  20. var baseURL: URL {
  21. return URL(string: ServerManager.shared.currentServer.address)!
  22. }
  23. var method: Moya.Method {
  24. return .get
  25. }
  26. var parameterEncoding: ParameterEncoding {
  27. return URLEncoding.default
  28. }
  29. var sampleData: Data {
  30. return Data()
  31. }
  32. var task: Task {
  33. return requestTaskWithParameters
  34. }
  35. var requestTaskWithParameters: Task {
  36. // 默认参数
  37. var defaultParameters: [String: Any] = [:]
  38. // 协议参数
  39. if let parameters = self.parameters {
  40. for (key, value) in parameters {
  41. defaultParameters[key] = value
  42. }
  43. }
  44. return Task.requestParameters(parameters: defaultParameters, encoding: parameterEncoding)
  45. }
  46. /// 实现此协议的类,将自动获得用该类实例化的 provider 对象
  47. static var provider: RxSwift.Reactive<MoyaProvider<Self>> {
  48. let key = "\(Self.self)"
  49. if let provider = retainProviders[key] as? RxSwift.Reactive<MoyaProvider<Self>> {
  50. return provider
  51. }
  52. let provider = Self.weakProvider
  53. retainProviders[key] = provider
  54. return provider
  55. }
  56. /// 不被全局持有的 Provider ,使用时,需要持有它,否则将立即释放,请求随即终止
  57. static var weakProvider: RxSwift.Reactive<MoyaProvider<Self>> {
  58. var plugins: [PluginType] = []
  59. #if DEBUG
  60. plugins.append(LogPlugin())
  61. #endif
  62. let provider = MoyaProvider<Self>(plugins: plugins)
  63. return provider.rx
  64. }
  65. }
  66. public extension RxSwift.Reactive where Base: MoyaProviderType {
  67. func request(_ token: Base.Target, callbackQueue: DispatchQueue? = nil) -> Observable<Response> {
  68. return Single.create { [weak base] single in
  69. let cancellableToken = base?.request(token, callbackQueue: callbackQueue, progress: nil) { result in
  70. switch result {
  71. case let .success(response):
  72. single(.success(response))
  73. case let .failure(error):
  74. single(.failure(error))
  75. }
  76. }
  77. return Disposables.create {
  78. cancellableToken?.cancel()
  79. }
  80. }.asObservable()
  81. }
  82. }
  83. private class LogPlugin: PluginType {
  84. func willSend(_ request: RequestType, target: TargetType) {
  85. print("\n-------------------\n准备请求: \(target.path)")
  86. print("请求方式: \(target.method.rawValue)")
  87. if let params = (target as? BarkTargetType)?.parameters {
  88. print(params)
  89. }
  90. print("\n")
  91. }
  92. func didReceive(_ result: Result<Response, MoyaError>, target: TargetType) {
  93. print("\n-------------------\n请求结束: \(target.path)")
  94. if let data = try? result.get().data, let resutl = String(data: data, encoding: String.Encoding.utf8) {
  95. print("请求结果: \(resutl)")
  96. }
  97. print("\n")
  98. }
  99. }