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
相关产品推荐
相关产品推荐

