为啥没有网络连接时 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.0Alamofire 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 需要这么长时间才能超时?的主要内容,如果未能解决你的问题,请参考以下文章

为啥以这种方式使用 Alamofire 时没有发现任何价值?

为啥我在使用本地 IIS 时等待 ttfb 的时间这么长?

为啥在网络拓扑图中服务器需要连交换机?

如何处理网络中间请求的变化 - Alamofire

谈谈HTTP协议中的长连接,短连接

为啥我的 mysql 简单外连接需要这么长时间?