gpt4 book ai didi

swift - URLSession dataTask 不运行

转载 作者:搜寻专家 更新时间:2023-11-01 06:57:16 36 4
gpt4 key购买 nike

我对这段代码有疑问。我在“非常糟糕的网络”配置文件下使用 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 或以下代码块运行它之前尝试测试事件的互联网连接,即使有连接但连接很差,它也会返回 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)

}

最佳答案

I'm guessing it doesn't run because the connection is bad, but how can I handle this scenario, since I cannot get a response from the completion handler as the line never runs?

您应该简单地接受您可能不会从完成处理程序获得响应。这就是异步操作的全部要点:您可能很快就会得到响应,可能需要很长时间,也可能永远不会。您的代码应该以处理该问题的方式编写。

默认情况下,当您创建 URLSession 时,其配置的 waitsForConnectivitytrue。您不应该使用 Reachability 来了解是否存在连接;你应该开始任务然后退后一步。任务会在可能的时候发生。

但是,如果这是 Not Acceptable 并且您需要提前失败,则将配置的 waitsForConnectivity 设置为 false。然后您将因超时而失败,可能会在一分钟后(默认设置)。

然而,还应该指出的是,使用带有完成处理程序的数据任务有点搬起石头砸自己的脚。这是一种非常有限的方法。最好为 session 提供一个委托(delegate)并实现委托(delegate)方法,以便在发生时接收有关正在发生的事情的完整信息。

关于swift - URLSession dataTask 不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52858902/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com