【问题标题】:Swift : Delay when calling an API the second time (URLSession and Alamofire)Swift:第二次调用 API 时延迟(URLSession 和 Alamofire)
【发布时间】:2020-09-11 08:19:02
【问题描述】:

我正在尝试快速调用 API,但调用时出现延迟。我注意到更新视图时的延迟,所以我在每个函数中放置了一些日志。顺便说一下,服务器的ping是80ms左右,我已经在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 秒的延迟),所以我的界面不会很快更新。 2 个视图使用相同的请求函数,但 URL 不同。 我试着先打电话给第二个,它立即被处理了......

所以我猜这不是 url 或数据的问题,而是任务管理器的问题?我也尝试使用静态共享任务管理器,结果相同。

谁能帮我解决这个问题?我在网上找不到这个问题。

【问题讨论】:

    标签: ios swift api alamofire urlsession


    【解决方案1】:

    您可以通过检查响应的metrics 属性来调查Alamofire Requests 的时间,它应该告诉您所有网络事件的时间,以及serializationDuration,它应该告诉您序列化多长时间回应了。但是您需要进行更多调查,以了解时间差异的来源,因为它可能是各种各样的事情。

    【讨论】:

    • 我检查了serializationDuration,它非常小。我通常在 View1 中调用 url1,在 View2 中调用 url2,并且我在两个视图中都对 url 进行了多次调用。在 response.metrics 中找到的持续时间告诉我:view2 中只有 url2 的持续时间很长,其他调用很快(view1 中的 url1 和 url2,view2 中的 url1)。在view2中url2的日志中:(Request End) 2020-05-25 16:46:15 +0000 (Response Start) 2020-05-25 16:46:19 +0000
    • 这表明服务器需要一段时间来响应您的请求。
    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2015-11-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多