Swift网络呼叫:延迟不断增加,最后请求超时

时间:2016-08-23 19:34:25

标签: ios swift api request connection-timeout

我正在开发一个需要大量使用API​​的Swift项目。一切都运行正常,但有时,我得到Code = -1001“请求超时。”调用API时出错。为了正确测试它,我使用循环并迭代它1000次,调用相同的API。

我正在使用公共API。 API是

let apiString = "https://oc-index.library.ubc.ca"

我的循环是

for i in 0 ..< 1000 {
    Alamofire.request(.POST, apiString).responseJSON { response in
        print(response.debugDescription)

        if response.result.isFailure {
            print("Failure")
        }
    }
}

现在在检查打印响应时,我看到每个新的api响应都会增加Latency,并且会延迟到60.14秒,最后是请求超时。第一次调用API时,延迟为2.225秒,日志中的时间轴,上次成功API的延迟为60.14秒。

在循环中第一次被击中时的API时间轴(当i = 1时)。

[Timeline]: Timeline: { "Request Start Time": 493671593.424, "Initial Response Time": 493671595.649, "Request Completed Time": 493671595.684, "Serialization Completed Time": 493671595.688, "Latency": 2.225 secs, "Request Duration": 2.260 secs, "Serialization Duration": 0.004 secs, "Total Duration": 2.264 secs }

上次成功API的时间表

[Timeline]: Timeline: { "Request Start Time": 493671593.859, "Initial Response Time": 493671621.500, "Request Completed Time": 493671621.513, "Serialization Completed Time": 493671621.519, "Latency": 60.140 secs, "Request Duration": 60.140 secs, "Serialization Duration": 0.007 secs, "Total Duration": 60.147 secs }

但如果我同步执行它,就不会出现这种超时的情况。 API被调用1000次,并且没有失败的情况。

我不明白为什么当我多次异步访问API时,延迟会以这种方式增加。我知道可以通过增加超时时间来避免错误。但我想知道它首先发生的原因。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

网络堆栈只允许同时执行一定数量的请求,并阻止发出新请求,直到某些请求完成为止。因此,您的1000个请求将尽快启动,但后面的请求需要等待前面的请求才能实际连接,因此时间越来越长。

请参阅此主题以获取有关如何处理该情况的一些详细信息: NSURLSession concurrent requests with Alamofire