swift 2.1 alamofire 超时方法

Posted

技术标签:

【中文标题】swift 2.1 alamofire 超时方法【英文标题】:swift 2.1 alamofire timeout method 【发布时间】:2016-02-25 06:03:27 【问题描述】:

我对 alamofire 超时方法有疑问, 首先,我的英语可能不够好,无法让你们理解我所说的......但我会厌倦解释我的问题

在我的项目中,我使用了 alamofire,出于某种原因,我需要确保我的应用程序在连接不良的区域工作。所以我正在考虑使用超时方法。

我看到有人说,使用 解决方案一:

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.timeoutIntervalForRequest = 2 // seconds
    self.alamofireManager = Alamofire.Manager(configuration: configuration)
    self.alamofireManager!.request(.GET, "http://example.com/")
.response  (request, response, data, error) in

会解决问题,但在我的情况下,我看到调试区域说我的请求是“取消”

所以我尝试了另一个我在这里看到的解决方案(***) 解决方案2:

let manager = Alamofire.Manager.sharedInstance
    manager.session.configuration.timeoutIntervalForRequest = 5
    manager.request(.POST, url, parameters: params, encoding: .JSON, headers: nil).response(queue: dispatch_get_main_queue())  (Request, res, data, error) -> Void in

这种方法似乎应该有效,但只有当我让我的应用程序进入后台并响应我的应用程序时,调试区域才会显示请求“超时”,否则调试区域不会显示任何内容,除非我将其切换到后台并响应应用程序。

我正在使用 Xcode 7.1 和 ios 9.0

更新: 如果我使用解决方案 2,如果我让 requesttimeout = 5 ,调试区域将显示“超时错误”,但需要超过 5 秒...有时会显示 30 秒左右,但有时会超过 1 分钟.. ..

更新2: 我发现了问题所在。问题是如果你使用reachabilty框架来检测连接状态,那么系统可能会先检测到连接是否开启,然后它会在isReachable之后显示请求超时(可能需要1分钟)。

【问题讨论】:

@oleg 谢谢你的解释,就我而言,我试图让我的项目在连接不良的区域工作,比如地铁或地下隧道。所以我在 iphone 设置上打开了开发人员工具包,其中网络链接调节器。使配置为 100% loss 。所以我不知道为什么花了这么长时间让我知道是超时.... 您找到了可行的解决方案吗? 【参考方案1】:

基于NSURLSessionConfiguration Class Reference

该属性决定所有任务的请求超时间隔 在基于此配置的会话中。请求超时 间隔控制任务应该等待多长时间(以秒为单位) 在放弃之前要到达的其他数据。与相关的计时器 每当有新数据到达时,都会重置此值。当请求定时器 到达指定的时间间隔而没有收到任何新数据,它 触发超时。

每当有新数据到达时,计时器就会重置,这就是您有不同错误时间的原因。

您还可以为请求设置一个更多参数:

manager.session.configuration.timeoutIntervalForResource = 5

【讨论】:

以上是关于swift 2.1 alamofire 超时方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift Alamofire 检查等待超时并放置错误

如何在alamofire中设置请求超时?

Alamofire5 设置请求超时时间

Alamofire5 设置请求超时时间

每两个请求之一中的 Swift Alamofire “请求超时”

Alamofire 超时不工作