第二次调用 API 时的延迟(URLSession 和 Alamofire)

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

我尝试用 swift 调用 API,但调用时出现延迟。我注意到更新视图时存在延迟,因此我在每个函数中放置了一些日志。顺便说一句,服务器的 ping 约为 80 毫秒,我已经在

DispatchQueue.main.async

中更新我的视图

我尝试了 URLSession 和 Alamofire(应该嵌入 URLSession),

URLSession 请求代码:

func getAPIContent(urlAPI: String, _ callbackFunction: @escaping (Data) -> ()) {
    logMessage("start get API at url : " + urlAPI)

    let session = URLSession.shared
    let url = URL(string: urlAPI)!
    let task = session.dataTask(with: url) { data, response, error in

        if error != nil || data == nil {
            print("Client error!")
            return
        }

        guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
            print("Server error!")
            return
        }

        guard let mime = response.mimeType, mime == "application/json" else {
            print("Wrong MIME type!")
            return
        }
        DispatchQueue.main.async {
            logMessage("calling callback...")
            callbackFunction(data!)
        }        
    }
    logMessage("launching api task...")
    task.resume()
}

Alamofire 请求代码(错误未处理):

func getAPIContent2(urlAPI: String, _ callbackFunction: @escaping (Data) -> ()) {
    logMessage("alamofire request")
    let request = AF.request(urlAPI)
    request.responseData { (response) in
        DispatchQueue.main.async {
            logMessage("calling callback...")
            callbackFunction(response.value!)
        }
    }
}

这是我得到的典型结果(我为此日志使用了 getAPIContent2()):


由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - alamofire 请求 2020 年 5 月 24 日星期日,地址: 19:12:07 中欧夏令时间

由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - 调用回调... 2020 年 5 月 24 日星期日,地址: 19:12:08 中欧夏令时间

由 /Users/lucien/Documents/table1/table1/TableViewController.swift 调用 - displayLines(networkData:) - 开始显示所有行 5 月 24 日星期日 2020 年 19:12:08 中欧夏令时间


由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - alamofire 请求 2020 年 5 月 24 日星期日,地址: 19:12:09 中欧夏令时间

由 /Users/lucien/Documents/table1/table1/utilities.swift 调用 - getAPIContent2(urlAPI:_:) - 调用回调... 2020 年 5 月 24 日星期日,地址: 19:12:14 中欧夏令时间

由 /Users/lucien/Documents/table1/table1/AddLineViewController.swift 调用 - displayDestinations(allStopsData:) - 开始显示目的地周日 2020 年 5 月 24 日 19:12:14 中欧夏令时间

您可以注意到,第一个调用会立即处理(并且视图会立即更新),但是第二个调用在 Alamofire 请求 (19:12:09) 和完成处理程序 (19:12:14) 之间有 5 秒的延迟,所以我的界面更新得不太快。这两个视图使用相同的请求函数,但 URL 不同。 我尝试先拨打第二个电话,但它立即被处理了......

所以我猜这不是网址或数据的问题,而是任务管理器的问题?我还尝试使用静态共享任务管理器,最终得到相同的结果。

任何人都可以帮助我解决这个问题吗?我在网上找不到这个问题。

ios swift alamofire urlsession
1个回答
0
投票

您可以通过检查响应的

Request
属性来调查 Alamofire
metrics
的时间,它应该告诉您所有网络事件的时间,以及
serializationDuration
,它应该告诉您序列化响应需要多长时间采取了。但您需要进行更多调查,看看时间差异来自何处,因为可能有多种原因。

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