ios - Swift 可选的完成处理程序
问题描述
我正在尝试在我的 Swift 应用程序中创建一个服务对象,以便更轻松地处理请求。我已经完成了大部分工作,但是我可能误解了完成处理程序。
我有这个函数,它只是发布到我正在运行的本地 API 端点。
func createList(name: String, completion: @escaping (Response) -> Void) {
let parameters = ["name": name, "user_id": session.auth.currentUser!.uid]
AF.request("\(url)/wishlist", method: .post, parameters: parameters, encoding: URLEncoding.default).responseDecodable(of: Response.self) { response in
switch response.result {
case .failure(let err):
print(err)
case .success(let res):
completion(res)
}
}
}
需要发生的只是我需要将该名称传递给我在这里执行的函数
barback.createList(name: name) -> after a button is tapped
但是,我现在收到此错误。
调用中缺少参数“完成”的参数
我的目标是只返回Response
对象,以便我可以访问其属性以在 UI 中执行某些操作。我无法返回res
这里,因为据我了解,这是一个异步请求,它实际上是从那个竞争处理程序返回的?(可能是屠杀)。我看到其他人这样做的方式是在参数中添加一个竞争处理程序并为其添加一个转义。
我的最终目标是做类似...
if barback.createList(name: name).status = 200
(trigger some UI component)
else
(display error toast)
end
我的功能在设计上有缺陷吗?我尝试将我的比赛处理程序更改为
完成:(@escaping(响应)-> Void)= nil
但在那里遇到了一些其他错误。这里有什么指导吗?
解决方案
调用createList
看起来更像这样:
barback.createList(name: name) { response in
if response.status == 200 {
// OK
} else {
// Error
}
}
这解决了这个问题,因为你现在正在运行这个completion
闭包——你传入的值{ response in ... }
在哪里response
。在这种情况下,你传入res
. 请参阅这篇关于使用完成处理程序的帖子。
如果您确实需要一个可选的完成处理程序,因此您并不总是需要包含它,您可以将定义更改为以下内容(添加 = { _ in }
,意味着它默认为空闭包):
func createList(name: String, completion: @escaping (Response) -> Void = { _ in })
另一种方法实际上是使闭包可选:
func createList(name: String, completion: ((Response) -> Void)? = nil)
然后在?
调用时需要的方法completion
中,因为它是可选的:
completion?(res)
推荐阅读
- c++ - 使用 CUDA 图进行 PeerToPeer 数据传输
- android - 填充剪辑在顶部缩放元素,但不是(真的)在侧面
- python - 无法在 Heroku 上启动 Selenium Chrome
- tensorflow - 用于人类活动识别的光流图像的预训练模型
- arduino - Wemos D1 Arduino - ESP32/8266 Cryptocurrency Ticker、WiFiManager 和 SSD1306 OLED 屏幕
- java - 谁能告诉我需要在此代码中进行哪些更改才能以表格格式显示日历?
- c++ - 使用预测时未处理的异常(FaceRecognizer)
- python - Python flask - 使用不同的日志错误级别记录到 2 个不同的目的地
- c++ - 如何多线程按下按钮?
- r - 如何确定R中图形的两个不同变量的线型和颜色?