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

iOS 16中loadValuesAsynchronously等API弃用问题的修复方法

解决AVAsset在iOS 16+的废弃API警告问题

原代码

asset.loadValuesAsynchronously(forKeys: keys) {
    DispatchQueue.main.async {
        var error: NSError?
        let status = asset.statusOfValue(forKey: "playable", error: &error)
        // 后续处理逻辑...
    }
}

收到的警告

loadValuesAsynchronously(forKeys:completionHandler:) 在iOS 16.0中已废弃:请使用 load(_:) 替代。对于没有对应AVAsyncProperty的非废弃属性,继续同步查询这些属性

statusOfValue(forKey:error:) 在iOS 16.0中已废弃:请使用 status(of:) 替代

修复方案

适配iOS 16+的简洁写法(Swift并发)

如果项目已适配Swift并发(iOS 13+支持),推荐使用async/await语法重构:

Task { @MainActor in
    do {
        // 异步加载playable属性
        try await asset.load(.playable)
        // 获取属性加载状态
        let status = asset.status(of: .playable)
        
        // 根据状态处理业务逻辑
        switch status {
        case .loaded:
            // 属性加载完成,可正常使用asset
            break
        case .failed(let error):
            // 加载失败,处理错误
            print("playable属性加载失败:\(error.localizedDescription)")
        case .cancelled:
            // 加载被取消
            break
        default:
            // 其他状态(如加载中)的处理
            break
        }
    } catch {
        // 捕获加载过程中的全局错误
        print("属性加载出错:\(error.localizedDescription)")
    }
}

兼容iOS 16以下版本的写法

如果需要支持旧系统,可通过版本判断做兼容:

if #available(iOS 16.0, *) {
    Task { @MainActor in
        do {
            try await asset.load(.playable)
            let status = asset.status(of: .playable)
            // 后续处理逻辑
        } catch {
            // 错误处理
        }
    }
} else {
    // 保留旧版本API逻辑
    asset.loadValuesAsynchronously(forKeys: ["playable"]) {
        DispatchQueue.main.async {
            var error: NSError?
            let status = asset.statusOfValue(forKey: "playable", error: &error)
            // 后续处理逻辑
        }
    }
}

关键改动说明

  • 用load(_:)替代loadValuesAsynchronously(forKeys:completionHandler:),结合Swift并发语法实现异步加载,代码更简洁易读
  • 用status(of:)替代statusOfValue(forKey:error:),直接传入AVAsset.Property枚举值(如.playable),避免字符串键值的拼写错误
  • 通过@MainActor确保UI相关逻辑在主线程执行,替代原有的DispatchQueue.main.async

内容的提问来源于stack exchange,提问作者user22339814

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:52:14