Saya baru mengenal Swift dan saya mencoba untuk memperbaiki permintaan Posting URL saya. Saya memiliki beberapa permintaan POST URL di dalam View Controller yang sama seperti ini. Semuanya berfungsi dengan baik tetapi menurut saya ada banyak kode berulang yang dapat digunakan kembali. Khususnya, saya tidak tahu cara meneruskan/menangani Model Data berbeda yang harus digunakan di parseRequest1 dan parseRequest2. Saya juga membaca bahwa seharusnya hanya ada satu sesi yang digunakan untuk permintaan URL dalam proyek yang sama. Bantuan apa pun akan sangat menghargainya!

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)
    }
} 

Lalu saya memiliki request2 permintaan URL lain yang hampir identik kecuali parameter, dan model yang akan digunakan untuk decoding dan tindakan di dalam 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)
        }
    } 
0
Luke 28 Februari 2020, 23:23

1 menjawab

Jawaban Terbaik

Satu-satunya perbedaan tampaknya:

  • parameter permintaan
  • jenis model yang dikembalikan
  • tindakan yang Anda lakukan setelah respons diterima

Ini berarti bahwa kita dapat menulis ini sebagai satu metode tunggal dengan mengambil tiga nilai di atas sebagai parameter:

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()
}

Anda kemudian dapat memanggil metode ini dengan parameter yang sesuai sesuai kebutuhan Anda.

1
Sweeper 28 Februari 2020, 20:33