我想将同步函数转换为异步函数,但我不知道正确的方法是什么。
假设我有一个同步函数,需要很长时间才能获得数据:
func syncLongTimeFunction() throws -> Data { Data() }然后我在下面的函数中调用它,它仍然是一个同步函数。
func syncGetData() throws -> Data {
return try syncLongTimeFunction()
}但是现在我想把它转换成异步函数。以下是正确的方法:
函数asyncGetData()异步抛出->数据{返回syncLongTimeFunction() }
func asyncGetData2()异步抛出->数据{返回尝试等待DispatchQueue.global().async { do { let data = try self.syncLongTimeFunction() continuation.resume(返回: data) } catch {continuation.resume(抛出:错误)} }
我觉得第一条路就够了,就像罗伯下面有答案一样。但是,当我像下面这样调用主线程上的异步函数时,syncLongTimeFunction()也是在主线程上处理的。所以它会阻塞主线程。
async {
let data = try? await asyncGetData()
}发布于 2022-11-26 07:01:57
几点意见:
。
func asyncGetData()异步抛出->数据{尝试等待Task.detached { try self.syncLongTimeFunction() }.value }
,它提供了一个异步实现,该实现将在当前参与者.上运行与该任务关联的任务。
Data的缓慢过程超出了您的控制范围,那么上面的操作就像您可以做的一样好。但是,如果syncLongTimeFunction是您自己的函数,其中包含一个循环,则可以使用checkCancellation或手动isCancelled测试添加取消支持,例如:- In `syncLongTimeFunction`, insert a `try Task.checkCancellation()`; and
- In `asyncGetData`, handle cancelation with [`withTaskCancellationHandler`](https://developer.apple.com/documentation/swift/withtaskcancellationhandler(operation:oncancel:%29).例如:
asyncGetData()异步抛出->数据{ let任务= Task.detached { try self.syncLongTimeFunction() }返回尝试等待withTaskCancellationHandler { try task.value } onCancel:{ task.cancel() } func syncLongTimeFunction()抛出->数据{.对于i in .{尝试Task.checkCancellation() .}返回.}
希望这说明了这个想法。不幸的是,如果没有更多关于syncLongTimeFunction的信息,就不可能变得更加具体。
https://stackoverflow.com/questions/69873970
复制相似问题