- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 Swift 4,我有这段代码尝试向 REST API 发出 POST 请求:
spinner.startAnimation(self)
btnOk.isEnabled = false
btnCancel.isEnabled = false
attemptPost()
spinner.stopAnimation(self)
btnOk.isEnabled = true
btnCancel.isEnabled = true
执行此操作的函数(Constants
和 Request
是我创建的用于创建请求对象并保存常用数据的类):
func attemptPost() {
let url = Constants.SERVICE_URL + "account/post"
let body: [String : Any] =
["firstName": txtFirstName.stringValue,
"lastName": txtLastName.stringValue,
"email": txtEmail.stringValue,
"password": txtPassword.stringValue];
let req = Request.create(urlExtension: url, httpVerb: Constants.HTTP_POST, jsonBody: body)
let task = URLSession.shared.dataTask(with: req) { data, response, err in
guard let data = data, err == nil else {
// error
return
}
if let resp = try? JSONSerialization.jsonObject(with: data) {
// success
}
}
task.resume()
}
由于执行此操作的任务是异步运行的,因此在对 attemptPost()
的调用返回后,我无法按顺序更新 UI。由于 UI 组件在主线程上,我无法直接从发出请求的任务更新组件。
在 C# 中,它的工作方式相同;有一个 BackgroundWorker
类,您可以在其中安全地更新 UI 组件以避免“跨线程操作无效”错误。
我试图找到一个完成或多或少相同事情的示例,其中建立“等待”状态,任务运行,并且在任务完成时,通知主线程任务已完成等待状态可以改变。
但我仍然无法理解这一切是如何在 Swift 中结合在一起的。我环顾四周,看到了有关从 URLSessionDataTask
中调用的处理程序的信息以及有关 GCD 的内容,但我仍然无法将这些点联系起来。
由于 URLSessionDataTask
任务从一开始就是异步的,因此 GCD 在这里是否相关?
感谢任何帮助。
最佳答案
如果我理解正确,您可以尝试这个解决方案:
spinner.startAnimation(self)
btnOk.isEnabled = false
btnCancel.isEnabled = false
attemptPost { (success) in
DispatchQueue.main.async {
spinner.stopAnimation(self)
btnOk.isEnabled = true
btnCancel.isEnabled = true
}
// UI wise, eventually you can do something with 'success'
}
func attemptPost(_ completion:@escaping (Bool)->())
let url = Constants.SERVICE_URL + "account/post"
let body: [String : Any] =
["firstName": txtFirstName.stringValue,
"lastName": txtLastName.stringValue,
"email": txtEmail.stringValue,
"password": txtPassword.stringValue];
let req = Request.create(urlExtension: url, httpVerb: Constants.HTTP_POST, jsonBody: body)
let task = URLSession.shared.dataTask(with: req) { data, response, err in
guard let data = data, err == nil else {
completion(false)
return
}
if let resp = try? JSONSerialization.jsonObject(with: data) {
completion(true)
}
}
task.resume()
}
所以这个想法是从 attemptPost
执行一个 block ,它将异步运行到主线程中你的 UI 东西
关于swift - 如何告诉主线程 URLSessionDataTask 已经完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47503403/
我正在使用 URLSessionDataTask 下载视频并播放它们(我需要缓存,所以我正在使用 func urlSession(_ session: URLSession, dataTask: UR
每次我收到以下错误: jsonError::Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 1."
使用 Swift 4,我有这段代码尝试向 REST API 发出 POST 请求: spinner.startAnimation(self) btnOk.isEnabled = false btnCa
我想模拟 URLSession,并返回一个模拟的 URLSessionDataTask。 为了模拟 URLSession 我创建了一个协议(protocol) protocol URLSessionP
我想模拟 URLSession,并返回一个模拟的 URLSessionDataTask。 为了模拟 URLSession 我创建了一个协议(protocol) protocol URLSessionP
我有一个 URLSessionDataTask 实例,我想知道操作何时开始(一个 Date 对象),这样我就可以计算已经过了多少时间。 我在 Apple 的文档 (https://developer.
我目前正在尝试为 URI 创建一个 URLSessionDataTask。因为 URI 是重定向的,所以我需要找出重定向的(最终)URL 是什么。为此,我想在 URLSessionDataDelega
我在我的 SwiftUI 应用程序中将此 APIRepresentative 类作为单例 EnvironmentObject。该类具有 @Published var,它按 ID 保存所有 Insigh
我正在尝试使用 URLSessionDataTask 访问我的后端 API。其中一部分包括访问使用 Safari 存储的 cookie。 例如http://api.example.com/v1/get
我有一个简单的应用程序,我以这种方式从存储在我自己的服务器中的 JSON 文件中获取数据 - 我正在使用 SwiftyJSON : func queryData(_ fileName:String)
我遇到了这个奇怪的问题,我无法对我不基于 GraphQL 控制的 REST 服务执行简单的 POST 请求。 问题是,无论我在 URLRequest 类的 httpMethod 属性中设置什么,它总是
基本上我有一些 JSON 数据,我希望从一堆 URL 中检索(全部来自同一主机),但是我只能大约每 2 秒至少请求一次此数据,并且一次只能请求一个,否则我会被服务器“时间禁止”。正如您将在下面看到的;
我是一名优秀的程序员,十分优秀!