为啥没有网络连接时 Alamofire 需要这么长时间才能超时?
Posted
技术标签:
【中文标题】为啥没有网络连接时 Alamofire 需要这么长时间才能超时?【英文标题】:Why is Alamofire taking so long to timeout when there is no network connection?为什么没有网络连接时 Alamofire 需要这么长时间才能超时? 【发布时间】:2017-01-19 21:40:51 【问题描述】:我正在使用 Swift 3.0
和 Alamofire 4
。我正在使用单例网络类向服务器发出API
请求。当没有互联网时,Alamofire 需要大约 30 秒来完成关闭并运行故障处理程序。这是我的代码:
func performRequest(_ url:String,completionHandler:@escaping (_ Success:Bool,AnyObject?) -> Void)
Alamofire.request(url).validate().responseJSON response in
if response.result.isSuccess //Request was successful
self.errorCount = 0
completionHandler(true,response.result.value as AnyObject?)
else
print("failure occured")
self.setNoInternetDialogAppear()
我也尝试使用此代码设置超时,但没有效果:
`Alamofire.SessionManager.default.session.configuration.timeoutIntervalForRequest = 2000`
我最近从 Swift 2.2 和 Alamofire 3 迁移了我的代码,并且从那以后才开始这样做。 TIA
【问题讨论】:
您必须在创建会话之前设置waitsForConnectivity
标志。会话获取配置的副本,因此之后更改它对创建的会话没有影响。
【参考方案1】:
var alamoFireManager = Alamofire.SessionManager.default
self.alamoFireManager.session.configuration.timeoutIntervalForRequest = 2000
....
self.alamoFireManager.request(...)
使用变量有效。
【讨论】:
谢谢。刚刚尝试过,但仍然遇到长时间超时。 看来超时正好是 60 秒。我已将“打印”方法与输出的时间放在一起。 奇怪!我正在使用这种精确的方法: pod 'AlamofireDomain', '4.1' 抱歉,希望我能进一步帮助您。【参考方案2】:最好在发出 alamofire 请求之前测试网络连接。试试这个功能。
class func isConnectedToNetwork() -> Bool
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
zeroAddress.sin_family = sa_family_t(AF_INET)
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress,
$0.withMemoryRebound(to: sockaddr.self, capacity: 1)
SCNetworkReachabilityCreateWithAddress(nil, $0)
) else
return false
var flags: SCNetworkReachabilityFlags = []
if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
return false
let isReachable = flags.contains(.reachable)
let needsConnection = flags.contains(.connectionRequired)
return (isReachable && !needsConnection)
【讨论】:
【参考方案3】:我仍在尝试理解为什么 Alamofire 在没有互联网的情况下需要这么长时间才能完成请求,但如果您只想更改超时间隔,可以使用 URLSessionConfiguration 对象。
Alamofire 5+ Swift 5+init(interceptor: RequestInterceptor)
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = HTTPHeaders.default.dictionary
configuration.timeoutIntervalForRequest = 15
self.session = Session(configuration: configuration, interceptor: interceptor)
【讨论】:
以上是关于为啥没有网络连接时 Alamofire 需要这么长时间才能超时?的主要内容,如果未能解决你的问题,请参考以下文章