请查看下面的代码:
backgroundthread.async {
return self.mycallback() //return string, int etc
}
我想从异步块返回一个值。我不需要任何完成处理程序或任何其他解决方法。
func getAppConfigFromDB(_ key: String) -> String
{
let value = String()
backgroundthread.async {
let inst = AppConfigDB.init(_APP_CONFIG_DB_PATH)
value = inst.getConfigurationInfo(key) // I want to return from here.
}
return value
}
getAppConfigFromDB("path")
答案 0 :(得分:0)
您的函数需要像这样的闭包
func getAppConfigFromDB(_ key: String, completion: @escaping (String?) -> Void) {
backgroundthread.async {
completion("string here")
}
}
调用函数时会这么做
getAppConfigFromDB("key") { (returnedString) in
//returnedString is Optional("string here")
}
答案 1 :(得分:0)
您用return self.mycallback()
描述的内容类似于
TypeScript:
String text = await someTask();
或在C#中:
String text = someTask().result;
和来自异步函数:
String text = await someTask();
但是这个概念并不迅速存在(我也认为Java)。
除了使用完成处理程序外,我唯一想到的另一种方法是将结果传递给另一个函数(注意:如果您打算在主线程/ UI线程上工作,则会得到一个异常-您将需要像这样将通话包裹在DispatchQueue.main.async {/*Do stuff...*/}
)
func startAsync {
let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
guard let data = data else { return }
guard let jsonString = String(data: data, encoding: .utf8) else { return }
DispatchQueue.main.async {
self.setResults(text: jsonString);
}
}
task.resume()
}
func setResults(text: String?){
textView.text = text;
}
完整项目: https://github.com/AppLogics/SwiftAsyncTaskWithoutCompletionHandler