为什么Alamofire在没有网络连接时超时时间如此之长?

3

我使用的是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迁移过来,这个问题只是从那时开始出现的。先谢谢了。


在创建会话之前,您必须设置waitsForConnectivity标志。会话将复制配置,因此在创建会话后更改配置不会对其产生影响。 - Enrique
3个回答

0
var alamoFireManager = Alamofire.SessionManager.default
self.alamoFireManager.session.configuration.timeoutIntervalForRequest = 2000
....
self.alamoFireManager.request(...)

使用变量起作用了。


谢谢。我刚试了一下,仍然遇到了长时间超时的问题。 - Oliver
看起来超时时间恰好为60秒。我已经使用输出时间的“print”方法。 - Oliver
奇怪!我正在使用这个确切的方法:pod 'AlamofireDomain','4.1'抱歉,希望我能为您提供更多帮助。 - karnett

0

在发送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)
}

0

我仍在努力理解为什么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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接