如何在 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 的连接超时