我正在尝试获取一个通过HTTP请求调用API并返回字符串的函数。我的请求功能具有一个完整的处理程序,该处理程序返回数据,并且由我的功能使用。
func buildHTML () -> String {
var htmlString: String = ""
request(url: "https://someurl.com/api/getalldata") { (jsonData: Data) in
let units = try JSONDecoder().decode([MyUnits].self, from: jsonData)
for unit in units {
//Building my html string here
htmlString += "......."
}
}
return htmlString
}
但是,这是不起作用的,因为HTMLString返回了一个空字符串,我该如何通过BuildHtml返回该字符串?
欢迎任何想法!
由于您的请求是异步的,因此您将无法返回结果,因为您的返回语句将在执行您的返回语句之前执行。在这种情况下,解决方案也是在外部功能中使用完整处理程序:
func buildHTML(_ completion: @escaping (String)->Void) {
var htmlString: String = ""
request(url: "https://someurl.com/api/getalldata") { (jsonData: Data) in
let units = try JSONDecoder().decode([MyUnits].self, from: jsonData)
for unit in units {
//Building my html string here
htmlString += "......."
}
completion(htmlString)
}
}
我的解决方案将阻止当前线程,但它是同步的。您可以使用数据。
func buildHTML(_ completion: @escaping (String)->Void) {
var htmlString: String = ""
let url = URL(string: "https://someurl.com/api/getalldata")!
guard let jsonData = try? Data(contentsOf: url) else {
print("There was an error!")
// return or break
}
let units = try JSONDecoder().decode([MyUnits].self, from: jsonData)
for unit in units {
//Building my html string here
htmlString += "......."
}
completion(htmlString)
}