SwiftUI 问答之 试图在我的 Swift 应用程序中创建一个服务对象来更轻松地处理请求,但收到Missing argument for parameter ‘completion’ in call

实战需求

我试图在我的 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 (Response) -> Void) = nil

但在那里遇到了其他一些错误。这里有什么指导吗?

解决方案

使用评论和答案中提到的完成处理程序。此外,您应该在失败时包含一个完成,否则您将永远无法退出该功能。

我会重组您的代码以应对可能发生的任何错误,如下所示:

func createList(name: String, completion: @escaping (Response?, Error?) -> 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)
            completion(nil, err)   
        case .success(let res):
            completion(res, nil)
        }
    }
}

像这样称呼它:

barback.createList(name: name) { (response, error) in
    if error != nil {

    } else {

    }
}

如果你没有在你的“case .failure”中放置一个完成(…),它永远不会离开那里。


精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复