You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:54:17