- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对这段代码有疑问。我在“非常糟糕的网络”配置文件下使用 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 时,其配置的 waitsForConnectivity
为 true
。您不应该使用 Reachability 来了解是否存在连接;你应该开始任务然后退后一步。任务会在可能的时候发生。
但是,如果这是 Not Acceptable 并且您需要提前失败,则将配置的 waitsForConnectivity
设置为 false
。然后您将因超时而失败,可能会在一分钟后(默认设置)。
然而,还应该指出的是,使用带有完成处理程序的数据任务有点搬起石头砸自己的脚。这是一种非常有限的方法。最好为 session 提供一个委托(delegate)并实现委托(delegate)方法,以便在发生时接收有关正在发生的事情的完整信息。
关于swift - URLSession dataTask 不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52858902/
我遇到了一些麻烦。查看下面的这部分代码: // Create a datatask and pass in the request let dataTask = session
我正在使用 URLSession.shared.dataTask 调用 Web 服务。使用带有 url 的 datatask 调用它可以正常工作,而使用 request 调用 datatask 将返回
我有一段普通的代码,我几乎在我的代码中到处使用: let configuration = URLSessionConfiguration.default let session = URLSessio
This question already has answers here: Swift 3 URLSession.shared() Ambiguous reference to member 'd
dataTask 方法的完成处理程序中的数据和响应参数有什么区别?哪一个是用来做什么的? Web api 将返回哪一个 json 数据? 最佳答案 JSON 数据在 data 参数中返回。 respo
我在我的 iOS 项目 (Swift 4) 中使用 URLSession。 var postRequest = URLRequest(url: myUrl) request.httpMetho
在某些网站上,以下方法无限期挂起,我想在请求花费太长时间时取消请求,我认为 timeoutIntervalForRequest 和 timeoutIntervalForResource 会控制这一点,
我正在将我的代码转换为 swift 3,但在以下代码中出现“没有更多上下文的情况下表达式类型不明确”错误。 open class func performGetRequest(_ targetURL:
这个问题在这里已经有了答案: Swift: How do I return a value within an asynchronous urlsession function? (3 个答案) 关
我的应用正在从 API 下载一些数据,我想将该数据保存在一个数组中,该数组将用于填充表格 View 。但是当 TableView 开始构建时,数据还没有下载,我的数组是空的。 var recipes
我有这个函数,我想用我在 dataTask 函数中获得的纬度/经度数据填充位置数组。 问题是数据只在 datatask 函数中可用,在它之外,它就会消失。 func getFromDatabase()
我对这段代码有疑问。我在“非常糟糕的网络”配置文件下使用 Network Link Conditioner 测试我的应用程序,并且在用户互联网连接不佳的情况下,此 dataTask 永远不会运行。如果
我正在使用以下代码向我的服务器发出请求: let configuration = URLSessionConfiguration.default let session = URLSession(co
我不想检查我的 url statusCode 是否等于 200,我创建了一个函数,如果 statusCode 等于 200 则返回一个 bool 值,我正在使用 dataTask,但我不知道如何返回一
我在 URLSession.shared.dataTask 任务中调用了一个闭包。问题是,当我在闭包中设置断点时,它不会完成执行。 func query(url: String, args: [Str
想要使用像downloadTask(withResumeData:)这样的函数,但想使用dataTask来实现 我有一个部分下载的文件,存储在 FileManager 中,想要下载其其余数据,但不想下
我有一个项目,我通过 API 发送和获取数据。发送和获取工作正常。 我的目标是等待服务器的响应(即:是|否),并根据它,是否继续继续,如果否则显示警报。 对于这部分我有: 带有客户端列表和添加新客户端
我正在快速开发一个上传项目。我正在使用 imagepickercontroller 获取非常大的文件(大小超过 500 MB 的视频、图片),并将该文件分成大小为 1 MB 的 block 。然后我将
我尝试在应用程序处于后台或挂起状态时将数据发回服务器。我已经通过是和否操作实现了可操作的推送通知。我必须通过点击是或否来更新后端。如果应用程序在前台运行但在后台或挂起状态下失败,我下面的代码可以正常工
这个问题在这里已经有了答案: Swift 3 URLSession.shared() Ambiguous reference to member 'dataTask(with:completion
我是一名优秀的程序员,十分优秀!