如何快速从异步块返回值

时间:2018-09-12 05:09:44

标签: swift multithreading

请查看下面的代码:

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")

2 个答案:

答案 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