Gum*_*645 2 uikit async-await swift swift-concurrency
是否可以在 UIKit 中使用 async/await 进行 POST HTTP 请求,即 from UIButton?
我可以发送请求,但它立即崩溃。完美地使用URLSession,并以此作为学习经验。
lazy var buttonTest: UIButton = {
let button = UIButton()
button.addTarget(self, action: #selector(testAsyncTwo), for: .touchUpInside)
return button
}()
@objc func testAsync() async throws {
let date = Date()
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = df.string(from: date)
let json: [String: Any] = ["item": "1",
"time": "\(dateString)"]
let jsonData = try? JSONSerialization.data(withJSONObject: json)
guard let url = URL(string: "https://myapiendpoint.com/api/") else { fatalError("Missing URL") }
var urlRequest = URLRequest(url: url)
let token: String = "mySecretKey"
urlRequest.setValue("Token \(token)", forHTTPHeaderField: "Authorization")
urlRequest.httpMethod = "POST"
urlRequest.setValue("\(String(describing: jsonData?.count))", forHTTPHeaderField: "Content-Length")
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = jsonData
let (data, response) = try await URLSession.shared.data(for: urlRequest)
guard (response as? HTTPURLResponse)?.statusCode == 200 else { fatalError("Error while fetching data") }
let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
if let responseJSON = responseJSON as? [String: Any] {
print(responseJSON) //Code after Successfull POST Request
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
崩溃与您的URLSession代码无关。问题是您已将 button\xe2\x80\x99s 选择器声明为异步抛出函数。这与@objc选择器不兼容。
代替:
\n@objc func testAsync() async throws { \n ... \n}\nRun Code Online (Sandbox Code Playgroud)\n和:
\n@objc func didTapButton(_ sender: Any) {\n Task {\n try await testAsync()\n }\n}\n\nfunc testAsync() async throws {\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n关键的观察结果是该@objc方法不是异步函数。我还会给按钮处理程序一个sender参数和一个更具描述性的名称,以遵循既定约定并一目了然地表明它正在处理按钮点击。
显然,当您执行此操作时,您还必须更改#selector引用:
button.addTarget(self, action: #selector(didTapButton(_:)), for: .touchUpInside)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |