簡體   English   中英

URLSession dataTask 長時間延遲

[英]URLSession dataTask long delay

當我從我的代碼中請求 API 時,我在 4-6 秒后得到了響應,這太長了。 從 Postman 我在 120 毫秒后得到響應。 我的代碼中有什么地方出錯了嗎? 這是我的代碼,我正在檢查這兩個打印之間的時間:

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

代替

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...

你應該使用

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

編輯:

我看到您想使用委托。 在這種情況下,您不應使用完成處理程序,而應添加委托方法:

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

查看 Apple 的文檔以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM