如何在swift中从异步块返回值

如何在swift中从异步块返回值,swift,multithreading,Swift,Multithreading,请查看以下代码: backgroundthread.async { return self.mycallback() //return string, int etc } 我想从异步块返回一个值。我不想要任何完成处理程序或任何其他解决方法 func getAppConfigFromDB(_ key: String) -> String { let value = String() backgroundthread.async { let inst = A

请查看以下代码:

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

正如@rmaddy所说,除了使用完成处理程序之外,没有其他方法

func getAppConfigFromDB(_ key: String, completion: @escaping ((String) -> Void)) {
    let value = String()
    backgroundthread.async {
        let inst = AppConfigDB.init(_APP_CONFIG_DB_PATH)
        value = inst.getConfigurationInfo(key) // I want to return from here.
        completion(value)
    }
}
您可以这样调用该方法

getAppConfigFromDB("") { (value) in
    // Use value to do something
}

正如@rmaddy所说,除了使用完成处理程序之外,没有其他方法

func getAppConfigFromDB(_ key: String, completion: @escaping ((String) -> Void)) {
    let value = String()
    backgroundthread.async {
        let inst = AppConfigDB.init(_APP_CONFIG_DB_PATH)
        value = inst.getConfigurationInfo(key) // I want to return from here.
        completion(value)
    }
}
您可以这样调用该方法

getAppConfigFromDB("") { (value) in
    // Use value to do something
}

您的函数需要这样一个闭包

func getAppConfigFromDB(_ key: String, completion: @escaping (String?) -> Void) {
    backgroundthread.async {
        completion("string here")
    }    
}
当你调用你的函数时

getAppConfigFromDB("key") { (returnedString) in
    //returnedString is Optional("string here")
}

您的函数需要这样一个闭包

func getAppConfigFromDB(_ key: String, completion: @escaping (String?) -> Void) {
    backgroundthread.async {
        completion("string here")
    }    
}
当你调用你的函数时

getAppConfigFromDB("key") { (returnedString) in
    //returnedString is Optional("string here")
}

使用
return self.mycallback()
描述的内容类似于

打字稿:

String text = await someTask();
或者在C#中:

从异步函数:

String text = await someTask();
然而,这个概念在swift中并不存在(我认为Java也是如此)

除了使用完成处理程序之外,我能想到的唯一其他方法是将结果传递给另一个函数(注意:如果您打算在主线程/UI线程上工作,您将得到一个异常-您需要像这样将调用包装在
DispatchQueue.main.async{/*Do stuff…*/}
)中

完整项目:

您用
返回self.mycallback()
描述的内容类似于

打字稿:

String text = await someTask();
或者在C#中:

从异步函数:

String text = await someTask();
然而,这个概念在swift中并不存在(我认为Java也是如此)

除了使用完成处理程序之外,我能想到的唯一其他方法是将结果传递给另一个函数(注意:如果您打算在主线程/UI线程上工作,您将得到一个异常-您需要像这样将调用包装在
DispatchQueue.main.async{/*Do stuff…*/}
)中

完整项目:

您别无选择,只能使用完成处理程序。您不能从异步调用返回值。好的,我们是否可以使用任何变通方法或自定义模板。我同意@rmaddy的观点,完成处理程序是异步任务完成时处理结果的唯一方法。他们给它起了个好名字!为什么要避免使用完成处理程序?出于某种原因,您试图解决什么问题,以避免最简单和正确的解决方案?这里和Swift API中有无数的示例。您别无选择,只能使用完成处理程序。您不能从异步调用返回值。好的,我们是否可以使用任何变通方法或自定义模板。我同意@rmaddy的观点,完成处理程序是异步任务完成时处理结果的唯一方法。他们给它起了个好名字!为什么要避免使用完成处理程序?出于某种原因,您试图解决什么问题,以避免最简单和正确的解决方案?这里和Swift API中有无数的示例。