Swift 網路請求 : Moya初步認識

weixin_34321977發表於2018-07-13
使用Moya建立簡單的網路請求
  • Moya初始化
open class MoyaProvider<Target: TargetType>: MoyaProviderType 
  • TargetType
public protocol TargetType
  • MoyaProviderType
public protocol MoyaProviderType: AnyObject {
    associatedtype Target: TargetType
    /// Designated request-making method. Returns a `Cancellable` token to cancel the request later.
    func request(_ target: Target, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> Cancellable
}

對比OC(簡單的)

如果從OC的網路請求轉為swift的Moya請求.關心的幾個點.
1.怎麼建立請求物件
2.如何設定請求引數
3.回撥事件


1. 建立一個MoyaProvider物件

1638260-53e68d18ce6fc629.png
image.png
  • a.建立一個testType型別的物件傳給MoyaProvider初始化.
  • b.在touchesBegan方法中使用provider發起網路請.

2.testType型別物件

enum testType {
    case demo1
    case demo2(name: String)
    case demo3(name: String, score: Int)
}

這裡用列舉建立了幾種不同的網路請求情況

擴充套件 testType
//通過擴充套件遵循協議 : 當一個型別已經符合了某個協議中的所有要求,卻還沒有宣告遵循該協議時,可以通過空擴充套件體的擴充套件來遵循該協議:
//從現在起,targetTypeDemo的例項可以作為 TargetType 型別使用:
extension testType : TargetType {
 // 請求伺服器的根路徑
    var baseURL: URL { return URL.init(string: "https://XXXXXXX")! }
    
    // 每個API對應的具體路徑
    var path: String {
        switch self {
        case .demo1: return "/get"
        case .demo2(name: _), .demo3(name: _, score: _): return "/post"
        }
    }
    
    // 各個介面的請求方式,get或post
    var method: Moya.Method {
        switch self {
        case .demo1: return .get
        case .demo2, .demo3: return .post
        }
    }
    
    // 請求是否攜帶引數,如果需要引數,就做如demo2和demo3的設定
    var task: Task {
        switch self {
        case .demo1:                    return .requestPlain // 無引數
        case let .demo2(name):          return .requestParameters(parameters: ["name" : name], encoding: URLEncoding.default) // 帶有引數,注意前面的let
        case let .demo3(name, score):   return .requestParameters(parameters: ["name" : name, "score" : score], encoding: URLEncoding.default) // 帶有引數,注意前面的let
        }
    }
    
    // 單元測試使用
    var sampleData: Data {
        switch self {
        case .demo1, .demo3: return "just for test".utf8Encoded
        case .demo2(let name): return "{\"name\": \(name)\"}".utf8Encoded
        }
    }
    
    // 請求頭
    var headers: [String : String]? {
        return ["Content-type" : "application/json"]
    }
}

3.回撥事件

 provider.request(testType.demo1, callbackQueue: nil, progress: { (response) in
            
        }) { (result) in
            
        }

PS : Moya用了很多的列舉和協議方面知識點.
參考內容:
Swift協議
Moya
Swift moya - 學習筆記
系統性學習Moya+Alamofire+RxSwift+ObjectMapper的配合使用
【iOS開發】Moya入坑記-用法解讀篇
RxSwift: ReactiveX for Swift

相關文章