Moya+Alamofire 2.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import Foundation
  2. import Alamofire
  3. public typealias Manager = Alamofire.SessionManager
  4. internal typealias Request = Alamofire.Request
  5. internal typealias DownloadRequest = Alamofire.DownloadRequest
  6. internal typealias UploadRequest = Alamofire.UploadRequest
  7. internal typealias DataRequest = Alamofire.DataRequest
  8. internal typealias URLRequestConvertible = Alamofire.URLRequestConvertible
  9. /// Represents an HTTP method.
  10. public typealias Method = Alamofire.HTTPMethod
  11. /// Choice of parameter encoding.
  12. public typealias ParameterEncoding = Alamofire.ParameterEncoding
  13. public typealias JSONEncoding = Alamofire.JSONEncoding
  14. public typealias URLEncoding = Alamofire.URLEncoding
  15. public typealias PropertyListEncoding = Alamofire.PropertyListEncoding
  16. /// Multipart form.
  17. public typealias RequestMultipartFormData = Alamofire.MultipartFormData
  18. /// Multipart form data encoding result.
  19. public typealias MultipartFormDataEncodingResult = Manager.MultipartFormDataEncodingResult
  20. public typealias DownloadDestination = Alamofire.DownloadRequest.DownloadFileDestination
  21. /// Make the Alamofire Request type conform to our type, to prevent leaking Alamofire to plugins.
  22. extension Request: RequestType { }
  23. /// Internal token that can be used to cancel requests
  24. public final class CancellableToken: Cancellable, CustomDebugStringConvertible {
  25. let cancelAction: () -> Void
  26. let request: Request?
  27. public fileprivate(set) var isCancelled = false
  28. fileprivate var lock: DispatchSemaphore = DispatchSemaphore(value: 1)
  29. public func cancel() {
  30. _ = lock.wait(timeout: DispatchTime.distantFuture)
  31. defer { lock.signal() }
  32. guard !isCancelled else { return }
  33. isCancelled = true
  34. cancelAction()
  35. }
  36. public init(action: @escaping () -> Void) {
  37. self.cancelAction = action
  38. self.request = nil
  39. }
  40. init(request: Request) {
  41. self.request = request
  42. self.cancelAction = {
  43. request.cancel()
  44. }
  45. }
  46. /// A textual representation of this instance, suitable for debugging.
  47. public var debugDescription: String {
  48. guard let request = self.request else {
  49. return "Empty Request"
  50. }
  51. return request.debugDescription
  52. }
  53. }
  54. internal typealias RequestableCompletion = (HTTPURLResponse?, URLRequest?, Data?, Swift.Error?) -> Void
  55. internal protocol Requestable {
  56. func response(callbackQueue: DispatchQueue?, completionHandler: @escaping RequestableCompletion) -> Self
  57. }
  58. extension DataRequest: Requestable {
  59. internal func response(callbackQueue: DispatchQueue?, completionHandler: @escaping RequestableCompletion) -> Self {
  60. return response(queue: callbackQueue) { handler in
  61. completionHandler(handler.response, handler.request, handler.data, handler.error)
  62. }
  63. }
  64. }
  65. extension DownloadRequest: Requestable {
  66. internal func response(callbackQueue: DispatchQueue?, completionHandler: @escaping RequestableCompletion) -> Self {
  67. return response(queue: callbackQueue) { handler in
  68. completionHandler(handler.response, handler.request, nil, handler.error)
  69. }
  70. }
  71. }