如何在 Swift 中创建连接超时?

Posted

技术标签:

【中文标题】如何在 Swift 中创建连接超时?【英文标题】:How to create connection timeout in Swift? 【发布时间】:2015-08-18 14:08:42 【问题描述】:

我正在尝试检查我的 Swift 应用程序中的网络连接,并在一定秒数后超时。我正在运行 XCode 7 Beta。我使用的代码来自this问题的答案,在这里:

class func isConnectedToNetwork() -> Bool 

        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, 
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
        ) else 
            return false
        

        var flags: SCNetworkReachabilityFlags = []
        if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 
            return false
        

        let isReachable = flags.contains(.Reachable)
        let needsConnection = flags.contains(.ConnectionRequired)
        return (isReachable && !needsConnection)
        

此代码在大约一分二十秒后没有连接(使用 ios 模拟器中的网络链接调节器)超时。我无法在网上找到任何使用此方法且超时的任何人的引用,这似乎非常奇怪,因为人们可以假设大多数应用程序超时将由开发人员指定,而不是任何预建方法设置。

另一种可能的方法是使用 NSURLConnection.sendSynchronousRequest() 和 NSMutableURLRequest 的 timeoutInterval 属性。这使用硬编码的 URL,这当然不太理想。如何使用此方法创建开发人员指定的连接超时?

【问题讨论】:

SCNetworkReachability 还有一个异步接口,使用在更改时自动调用的回调。 Swift 2 可以使用这个(基于 C 的)回调。请参阅我对 ***.com/a/27142665/1187415 的最新更新。 是否可以在不使用主机 url 的情况下使用 SCNetworkReachability 的异步模型?我仍在试图弄清楚这个过程,但它看起来像主机,用于可达性,正在尝试访问 google.com。无法访问 google.com 但有连接的情况会怎样? 【参考方案1】:

您可以添加NSTimer(应该比超时时间短)发送连接请求以保持活动状态。 超时由服务器而不是客户端设置。

【讨论】:

类似于以指定的超时时间调用“NSTimer.scheduledTimerWithTimeInterval()”以及在超时情况下继续执行的某种方法,然后以 isConnectedToNetWork()' 作为条件的 if 分支?这样做听起来可能会奏效(我正在尝试调试我的尝试),但这就是您的回答的意思吗? @Jthami05 是的,就是这样。

以上是关于如何在 Swift 中创建连接超时?的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE[HY000] [2002] 与 AW 的连接超时

在 docker-compose 中挂载 NFS 卷时连接超时

linux下的Plink超时和代理

MySQL超时过期后c3p0的连接抛出异常

配置Tomcat和在Eclipse中创建Web工程

如何解决高并发,连接等待超时的异常