首页 > 解决方案 > 如何从 if let data string 语句中设置 serverResponse var

问题描述

func getResponse(serverName: String) -> String {

        var serverResponse: String = "No Response"
        let serverURL = "http://" + serverName + ":3000"

        if let url = URL(string: serverURL) {
           URLSession.shared.dataTask(with: url) { data, response, error in
              if let data = data {
                if let jsonString = String(data: data, encoding: .utf8) {

                    serverResponse = jsonString
                    print(jsonString)
                 }
               }
           }.resume()
        }
    return serverResponse
}

我试图serverResponse从 if let jsonString 中设置变量,但它总是返回“No response”(vars 默认值),并且 if let jsonString 中的 print 函数将打印出服务器响应。

标签: swiftvar

解决方案


DataTask 是异步的。您的函数在服务器请求完成之前返回该值。您应该在这里使用完成处理程序。

func getResponse(serverName: String , completion : @escaping (Bool,String?) -> ()) {

        let serverURL = "http://" + serverName + ":3000"
        if let url = URL(string: serverURL) {
           URLSession.shared.dataTask(with: url) { data, response, error in
              if let data = data {
                if let jsonString = String(data: data, encoding: .utf8) {
                    print(jsonString)
                    completion(true,jsonString)
                 }
              } else {
                completion(false,nil)
            }
           }.resume()
        }
}

然后你可以像这样调用上面的函数:

    getResponse(serverName: "yourServerName") { (isSuccess, response) in
        if isSuccess {
            self.serverResponse = response ?? ""
        } else {
            // your api request failed. show alert or whatever you want to inform the user.
        }
    }

推荐阅读