繁体   English   中英

Swift:我可以将异步/等待语法与已经同步返回值的 function 一起使用吗?

[英]Swift: can I use async/await syntax with a function that already returns synchronously a value?

我知道我可以使用 async/await 来替换它:

func test(_ completion: @escaping (Int) -> Void) {
    // ...
    completion(foundValue)
}

有了这个:

func test async -> Int {
    let result = await calculate()
    return result
}

但是,如果最初的 function 是这样的,我可以做些什么吗?

func test(_ completion: @escaping (Int) -> Void) -> Int {
    // ...
}

谢谢您的帮助

如果您的 function 不需要等待完成处理程序调用,那么您可以创建一个顶级任务并在执行异步工作后从任务中调用您的完成处理程序:

func test(_ completion: @escaping (Int) -> Void) -> Int {
    // synhronous calls
    Task {
        // async funtion calls
        completion(value)
    }
    return value
}

如果您需要在返回之前等待所有异步任务完成,您可以使用信号量:

func test(_ completion: @escaping (Int) -> Void) -> Int {
    let semaphore = DispatchSemaphore(value: 0)
    // synhronous calls
    Task {
        // async funtion calls
        completion(value)
        // signal async task completion
        semaphore.signal()
    }
    // wait for async task completion
    semaphore.wait()
    return value
}

请注意,使用semaphore.wait()会阻塞当前线程,并且阻塞线程会导致现代并发中未定义的运行时行为。 因此,在使用这种方法时要谨慎行事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM