【发布时间】:2018-10-17 15:49:56
【问题描述】:
我对这段代码有疑问。我正在“非常糟糕的网络”配置文件下使用 Network Link Conditioner 测试我的应用程序,并且在用户的互联网连接不佳的情况下,这个 dataTask 永远不会运行。如果连接良好,则此代码可以正常工作。我猜它没有运行是因为连接不好,但是我该如何处理这种情况,因为我无法从完成处理程序中获得响应,因为该行永远不会运行?
let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
do {
print("RUNNING RECEIPT UPLOAD TASK")
if let jsonObj: [String : AnyObject] = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions(rawValue: 0)) as? [String : AnyObject] {
if let resultData: [String : AnyObject] = jsonObj["result"] as? [String : AnyObject] {
if let status: Bool = resultData["status"] as? Bool {
if status {
completion(status, nil, resultData)
} else {
if let errorMessage: String = resultData["message"] as? String {
completion(status, errorMessage, resultData)
} else {
completion(status, "FAILED RECEIPT UPLOAD", resultData)
}
}
}
} else {
completion(false, "FAILED RECEIPT UPLOAD", nil)
}
} else {
completion(false, "FAILED RECEIPT UPLOAD", nil)
}
} catch _ {
completion(false, "FAILED RECEIPT UPLOAD", nil)
}
})
task.resume()
如果我在使用 Reachability 或以下代码块运行它之前尝试测试活动的 Internet 连接,即使有连接但它很差,它也会返回 true,所以我无法通过测试来处理未运行的 dataTask首先连接。
static func isInternetAvailable() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
var flags = SCNetworkReachabilityFlags()
if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
return false
}
let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
return (isReachable && !needsConnection)
}
【问题讨论】:
-
您可以为请求设置请求超时...并在超时后向用户显示消息,例如互联网连接不佳或其他什么。
标签: swift