Swift中如何实现依赖其他AsyncSequence的AsyncSequence函数
报错原因
AsyncStream 初始化方法接收的构建闭包为同步执行类型,Xcode 13.4.1 搭载的Swift标准库中,该闭包不支持直接编写for await等异步逻辑——一旦闭包内存在异步调用,闭包会被推断为async类型,与参数要求的同步闭包类型不匹配,就会抛出题目中的编译错误。
正确实现方式
在同步构建闭包内显式创建独立Task承载所有异步逻辑,同步闭包本身只负责任务启动,不执行任何异步操作。AsyncStream的Continuation是线程安全的,在Task内、甚至在异步回调中调用yield/finish都不会有线程安全问题。
修正后的代码如下:
func blurredFaces() -> AsyncStream<BlurredImage> { AsyncStream<BlurredImage> { continuation in // 启动异步任务执行流的生产逻辑 Task { for await image in sourceImages() { blurrImage(image) { blurredImage in continuation.yield(blurredImage) } } continuation.finish() } } } // sourceImages方法保持原有实现即可 func sourceImages() -> AsyncStream<SourceImage> { // ... }
额外说明
- 如果可以改造
blurrImage方法,建议通过withCheckedContinuation将其回调形式转换为async函数,后续可以直接在循环内写let blurredImage = await blurrImage(image),去掉嵌套回调,逻辑更清晰 - Xcode 14及以上版本搭载的Swift 5.7+已经为AsyncStream新增了接收async构建闭包的初始化重载,高版本环境下可以省略手动包裹
Task的逻辑,直接在构建闭包内写异步代码即可 - 注意不要在Task外部持有continuation的额外引用,所有生产、结束流的逻辑都放在Task内部执行,避免出现流提前结束、内存泄漏等问题
内容的提问来源于stack exchange,提问作者iljawascoding
相关产品推荐
相关产品推荐

