iosswiftnsurlsessionurlsessionnsurlsessiondatatask

URLSession dataTask long delay


When I'm requesting API from my code I got response after 4-6sec which is way too long. From Postman I'm getting response after 120ms. Is that something in my code goes wrong? here is my code, I'm checking time between those two prints:

func makeUrlRequest<T: Codable>(_ request: URLRequest, resultHandler: @escaping (Result<T, RequestError>) -> Void) {
        var req = request
        req.addValue("application/json", forHTTPHeaderField: "Content-Type")
        req.addValue("application/json", forHTTPHeaderField: "Accept")
        let config = URLSessionConfiguration.default
        let urlSession = URLSession(configuration: config, delegate: self, delegateQueue: .main)
        print("Request: start at: \(Date())") //Request: start at: 2021-04-09 06:53:32 +0000
        let urlTask = urlSession.dataTask(with: req) { data, response, error in
            print("Request: finished at: \(Date())") //Request: finished at: 2021-04-09 06:53:36 +0000
            DispatchQueue.main.async {
                guard error == nil else {
                    resultHandler(.failure(.clientError))
                    return
                }

                guard let response = response as? HTTPURLResponse, 200...299 ~= response.statusCode else {
                    resultHandler(.failure(.serverError))
                    return
                }

                guard let data = data else {
                    resultHandler(.failure(.noData))
                    return
                }

                guard let decodedData: T = self.decodedData(data) else {
                    resultHandler(.failure(.dataDecodingError))
                    return

                }
                
                resultHandler(.success(decodedData))
            }
        }

        urlTask.resume()
    }

Solution

  • Instead of

    let urlSession = URLSession(configuration: config, delegate: self, delegateQueue: .main)
    print("Request: start at: \(Date())") //Request: start at: 2021-04-09 06:53:32 +0000
    let urlTask = urlSession.dataTask(with: req) { data, response, error in...
    

    You should use

    let task = URLSession.shared.dataTask(with: req) { (data, response, error) in...
    

    EDIT:

    I see that you would like to use a delegate. In that case you shouldn't use a completion handler but instead add the delegate methods:

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
    
    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    

    Check out Apple's documentation for more info.