2016-08-23 26 views
1

我正在开发一个Swift项目,它需要大量的API消耗。一切正常,但有时,我得到Code = -1001“请求超时。”调用API时出错。为了正确测试它,我使用循环并迭代1000次,调用相同的API。Swift网络调用:延迟不断增加,最后请求超时

我正在使用公共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响应增加,去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

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

看到这个线程如何处理这种情况的一些细节: NSURLSession concurrent requests with Alamofire

+0

还好理解并感谢您的答复。 –