从内部DispatchQueue Swift返回



我正在构建一个函数,该函数接受CLLocation参数并返回我自己定义的类型为DarkSkyResponse的Weather Forecast。

public func getForecast(at location: CLLocation) -> DarkSkyResponse {
let request = DarkSkyRequest(key: "KEYGOESHERE")
let point = DarkSkyRequest.Point(location.coordinate.latitude, location.coordinate.longitude)
guard let url = request.buildURL(point: point) else {
preconditionFailure("Failed to construct URL")
}
let task = URLSession.shared.dataTask(with: url) {
data, response, error in
DispatchQueue.main.async {
guard let data = data else {
fatalError("No Data Recieved")
}
guard let forecast = DarkSkyResponse(data: data) else {
fatalError("Decoding Failed")
}
return forecast
}
}
task.resume()
}

一切都很完美,我只想返回在DispatchQueue中找到的forecast变量。当我尝试这样做时,我遇到了以下错误:Unexpected non-void return value in void function我相信这是因为我正在返回DispatchQueue内部。

为了解决这个问题,我将数据任务和解码过程移到了它自己的函数中,该函数有一个完成处理程序。当我调用函数时,我只设置了闭包来返回输出,如下所示:

public func getForecast(at location: CLLocation) -> DarkSkyResponse {
let request = DarkSkyRequest(key: "KEYGOESHERE")
let point = DarkSkyRequest.Point(location.coordinate.latitude, location.coordinate.longitude)
guard let url = request.buildURL(point: point) else {
preconditionFailure("Failed to construct URL")
}
func getDataAndDecode(from url: URL, completionBlock: @escaping (DarkSkyResponse) -> Void) -> Void {
let task = URLSession.shared.dataTask(with: url) {
data, response, error in
DispatchQueue.main.async {
guard let data = data else {
fatalError("No Data Recieved")
}
guard let forecast = DarkSkyResponse(data: data) else {
fatalError("Decoding Failed")
}
completionBlock(forecast)
}
}
task.resume()
}
getDataAndDecode(from: url) { (output) in
return output
}
}

现在我收到一条警告:Expression of type 'DarkSkyResponse' is unused。我这样做是正确的,还是有更优雅的方式来回报我想要的价值?

目前,swift还不支持异步等待样式(类似于javascript(,这意味着您不能直接从异步操作返回。您最好将回调(completionBlock(参数放在getForecast方法中。如果回调也能处理错误情况(例如onSuccessonError(,那就太好了。不要忘记将getForecast方法设置为void方法。

所以它会是这样的:


func getForecast(at location: CLLocation, onSuccess: (DarkSkyResponse) -> (), onError: (Error) -> ()) {
...
}

最新更新