swift - 从回调函数swift中获取值

标签 swift

问题 我想获得从我的 ApiToken 函数返回的值,以便我可以在另一个函数中使用它。由于某种原因,我无法从此函数中获取值,它不会返回任何内容。我如何从我的 ApiToken 函数返回值并在另一个函数中使用它。

这是我的带有 ApiToken 函数的 GetApiToken 类

class GetApiToken {



    public func ApiToken(link: String,  completionBlock: @escaping (String) -> Void) -> Void
    {
        let url = URL(string: link)!
        let jsonDict = ["username": "snow", "password": "ssssssssss"]
        let jsonData = try! JSONSerialization.data(withJSONObject: jsonDict, options: [])

        var request = URLRequest(url: url)
        request.httpMethod = "post"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error {
                print("error:", error)
                return
            }

            do {
                guard let data = data else { return }

                guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject] else { return }

                //self.token = json["access_token"] as? String ?? "x"
                completionBlock((json["access_token"] as? String)!)



            } catch {
                print("error:", error)
            }
        }

        task.resume()
    }
}

这是我试图获得值(value)的地方

func getData(_ link:String)
    {
        let url = URL(string: link)!
        var request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 20)
        request.httpMethod = "GET"
        var output = ""
        GetApiToken().ApiToken(link: "http://localhost:5000/auth", completionBlock: { str in
            output = str

        })
        request.addValue("JWT  \(output)", forHTTPHeaderField: "Authorization")
        request.setValue("application/json", forHTTPHeaderField: "Content-Type") ..........

最佳答案

这是一个异步调用,因此您需要将在完成回调中检索到数据后发生的所有事情放在一起

func getData(_ link:String)
{
    let url = URL(string: link)!
    var request = URLRequest(url: url, 
                             cachePolicy: .reloadIgnoringCacheData,
                             timeoutInterval: 20)
    request.httpMethod = "GET"
    GetApiToken().ApiToken(link: "http://localhost:5000/auth", 
                           completionBlock: 
                           { output in
                             request.addValue("JWT  \(output)", forHTTPHeaderField: "Authorization")
                             request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
                             .......
                           })

关于swift - 从回调函数swift中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46492119/

相关文章:

swift - 无需 Homebrew 即可在 macOS 上安装 Vapor

ios - 使用按钮将日期增加 2 周

Swift - 以编程方式制作的按钮不是完美的圆形吗?边缘平坦?

ios - 无法使用 Firebase 检索最近添加的值

ios - 动态单元格大小uitableview

ios - swift 的reactivecocoa 是双向数据绑定(bind)吗

ios - 如何创建与 Alamofire 一起使用的 NTLM 身份验证 header ?

Swift Cast 泛型类型

swift - Xcode firebase 简单写入数据

ios - 在 swift 中对动态键和动态对象使用 Codable