swift - 如何从 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 函数将打印出服务器响应。
解决方案
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.
}
}
推荐阅读
- webpack - 如何配置 Quasar SPA / Webpack 开发服务器以在子文件夹中启动以使用 Apache 进行代理?
- vba - 在自动编号字段上使用 DMax 命名 MkDir 创建的文件夹
- docker - 如何解决在 docker run 命令期间挂载卷时权限被拒绝的问题?
- javascript - Phoenix 1.4 服务器正在交付默认 HTML 而不是请求的 JS 文件
- node.js - 如何修复每个文件上的“npm WARN tar ENOENT:没有这样的文件或目录”
- python - 如何使for循环完成,然后才触发scrapy函数
- python - 在 numpy 中快速找到对称对
- vb.net - 即使使用另一个全屏应用程序也能保持图像打开
- python-3.6 - 如何删除“builtin_function_or_method”对象不能解释为整数错误
- azure - 为什么我可以在 Azure Cloud Shell Bash 中创建新文件和目录,但不能在 PowerShell 中创建?