Swift知识碎片: 关于Swift中的Continuation的概念扫盲

487 阅读2分钟

前言

在 Swift 中,Continuation 是用于在异步代码中桥接同步和异步操作的机制,通常与 Swift 的 Concurrency 特性(如 async/await)结合使用。通过 Continuation,可以将基于回调的异步代码转换为可以使用 async/await 的形式,从而简化异步编程模型。

Swift 提供了两种主要的 Continuation 类型:

  1. CheckedContinuation
  2. UnsafeContinuation

1. CheckedContinuation

CheckedContinuation 是一种安全的 continuation 类型,Swift 会对它进行检查,确保其被正确使用。例如,系统会确保 resume(恢复 continuation 的函数)被调用一次,且不会在 continuation 已经被恢复后再次调用,这种方式可以防止一些常见的编程错误。

CheckedContinuation 的用法通常是在将传统的基于回调的代码转换为 async/await 风格时。例如:

func fetchData() async throws -> String {
    return try await withCheckedThrowingContinuation { continuation in
        someAsyncOperation { result in
            switch result {
            case .success(let data):
                continuation.resume(returning: data)
            case .failure(let error):
                continuation.resume(throwing: error)
            }
        }
    }
}

在这个例子中,withCheckedThrowingContinuation 被用于包装异步操作。continuation.resume(returning:) 用于在操作成功时返回数据,continuation.resume(throwing:) 用于在操作失败时抛出错误。

  • withCheckedContinuation:适用于不抛出错误的情况。
  • withCheckedThrowingContinuation:适用于可能抛出错误的情况。

2. UnsafeContinuation

UnsafeContinuation 不会像 CheckedContinuation 那样进行安全性检查。这意味着开发者需要确保 resume 方法的正确调用,否则可能会导致未定义行为。

示例:

func fetchData() async -> String {
    return await withUnsafeContinuation { continuation in
        someAsyncOperation { result in
            continuation.resume(returning: result)
        }
    }
}

通常,除非有特殊需求,否则更建议使用 CheckedContinuation,因为它提供了额外的安全性保障。

总结

Continuation 的主要用途是将传统的基于回调的异步代码转换为可以用 async/await 进行处理的形式,从而简化异步编程。CheckedContinuation 提供了安全性检查,避免重复调用 resume,而 UnsafeContinuation 允许更灵活但不安全的使用。