如何利用Swift新并发特性等待资源加载完成?
借助Swift新并发特性实现资源加载等待的方案
可以利用Swift的async/await特性结合actor的线程安全机制,实现更简洁的资源加载等待逻辑,替代传统的命令模式排队方案。以下是优化后的代码实现:
enum ResourceState { case initial case loading case loaded } actor Resource { var state = ResourceState.initial private var loadingTask: Task<Void, Error>? // 记录当前加载任务,避免重复触发 func load() async throws { guard state == .initial else { return } state = .loading defer { state = .loaded loadingTask = nil } // 替换为实际的异步加载逻辑(如网络请求、文件读取) try await Task.sleep(nanoseconds: 1_000_000_000) } func do🍌WithResource() async throws { try await ensureResourceLoaded() // 执行🍌相关操作 print("完成🍌操作") } func do🍊WithResource() async throws { try await ensureResourceLoaded() // 执行🍊相关操作 print("完成🍊操作") } // 统一封装资源加载检查与等待逻辑 private func ensureResourceLoaded() async throws { switch state { case .initial: loadingTask = Task { try await load() } try await loadingTask?.value case .loading: // 等待正在进行的加载任务完成 try await loadingTask?.value case .loaded: // 资源已就绪,直接执行后续操作 break } } }
方案优势
- 代码简洁直观:用
async/await替代传统的队列存储与回调逻辑,业务代码与加载逻辑解耦更清晰 - 避免重复加载:通过
loadingTask记录当前加载任务,即使多个方法同时调用,也只会触发一次资源加载 - 线程安全保障:依托
actor的特性,所有状态访问和操作都自动在串行队列中执行,无需手动处理锁 - 错误处理自然:加载过程中的错误可通过
throws向上传递,符合Swift的错误处理范式
与传统命令模式的对比
传统命令模式需要维护待执行操作的队列,加载完成后遍历执行队列中的任务,代码复杂度更高;而本方案通过Task的value属性直接等待加载完成,逻辑更贴合现代并发编程的思维,减少了状态维护的成本。
内容的提问来源于stack exchange,提问作者Kirsteins
相关产品推荐
相关产品推荐

