快速-多个URL请求-重构和重用的代码

问题描述 投票:0回答:1

我是Swift的新手,我正在尝试重构我的URL Post请求。我在同一个View Controller中有这样的多个URL POST请求。一切正常,但在我看来,有很多重复的代码可以重用。特别是,我不知道如何传递/处理应在parseRequest1和parseRequest2中使用的不同数据模型。我还读到,同一项目中应该只有一个会话用于URL请求。任何帮助将不胜感激!

func request1() {        
    let parameters = [...//some parameters to send]
    guard let url = URL(string: "https//www.....") else {return}
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    guard let parametersToSend = try? JSONSerialization.data(withJSONObject: parameters, options: []) 
       else {
         print("Error")
         return
       }
    request.httpBody = parametersToSend
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
       if let safeData = data {
          self.parseRequest1(data: safeData)
        }
   }.resume()
}

func parseRequest1(data: Data){
    let decoder = JSONDecoder()
    do{
      let decodedData = try decoder.decode(DataModelForRequest1.self, from: data)
        DispatchQueue.main.async {
           self.performAction1(request1Result)
        }
    } catch {
       print(error)
    }
} 

然后,我有另一个URL请求request2,除了参数和用于parseRequest2内部的解码和操作的模型外,其余几乎相同。

func request2() {        
        let parameters = [...//some parameters to send]
        guard let url = URL(string: "https//www.....") else {return}
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        guard let parametersToSend = try? JSONSerialization.data(withJSONObject: parameters, options: []) 
           else {
             print("Error")
             return
           }
        request.httpBody = parametersToSend
        let session = URLSession.shared
        session.dataTask(with: request) { (data, response, error) in
           if let safeData = data {
              self.parseRequest2(data: safeData)
            }
       }.resume()
    }

    func parseRequest2(data: Data){
        let decoder = JSONDecoder()
        do{
          let decodedData = try decoder.decode(DataModelForRequest2.self, from: data)
            DispatchQueue.main.async {
               self.performAction2(request2Result)
            }
        } catch {
           print(error)
        }
    } 
swift nsurlrequest urlsession
1个回答
0
投票

唯一的区别似乎是:

  • 请求参数
  • 返回的模型类型
  • 您收到回复后的操作

这意味着我们可以将以上三个值作为参数编写为单个方法:

func request<T: Codable>(modelType: T.Type, parameters: [String: Any], completion: (T) -> Void) {

    func parseResponse(data: Data){
        let decoder = JSONDecoder()
        do{
          let decodedData = try decoder.decode(T.self, from: data)
            DispatchQueue.main.async {
              completion(decodedData)
            }
        } catch {
           print(error)
        }
    } 

    guard let url = URL(string: "https//www.....") else {return}
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    guard let parametersToSend = try? JSONSerialization.data(withJSONObject: parameters, options: []) 
       else {
         print("Error")
         return
       }
    request.httpBody = parametersToSend
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
       if let safeData = data {
          parseResponse(data: safeData)
        }
   }.resume()
}

然后您可以根据需要使用适当的参数调用此方法。

© www.soinside.com 2019 - 2024. All rights reserved.