gpt4 book ai didi

swift - 使用 AVMetadataItem.value 快速获取媒体标题

转载 作者:行者123 更新时间:2023-11-30 10:08:42 24 4
gpt4 key购买 nike

我想通过AVMetadataItem类获取媒体标题

 /* provides the value of the metadata item */
@NSCopying public var value: protocol<NSCopying, NSObjectProtocol>? { get }

以上是Apple官方对value属性的说明

import Foundation
import AVFoundation
extension AVAsset{
func title() ->String{
let key = "commonMetadata";

self.loadValuesAsynchronouslyForKeys([key]){
if(self.statusOfValueForKey(key, error:nil) == .Loaded)
{
let metadata = AVMetadataItem.metadataItemsFromArray(self.metadata, withKey: key, keySpace: AVMetadataKeySpaceCommon)
if(metadata.count > 0){
let item = metadata[0];
return (item.value?.copyWithZone(nil))! as! String;
}

}
};
}
}

然后我收到错误“void 函数中出现意外的非 void 返回值”,其中我使用“as”执行类型转换

最佳答案

紧跟在 loadValuesAsynchronouslyForKeys 后面的大括号是一个闭包,它是该方法的 completionHandler 参数。正如该方法的名称所暗示的,它是一个异步操作。

这意味着闭包不能代表您编写的函数返回。闭包本身具有 void 返回类型,因此您无法从中返回值(因此您看到的错误消息)。

这也意味着您无法真正在 title() 方法中隐藏异步进程...至少,不是那么简单。

调用 loadValuesAsynchronouslyForKeys 后,闭包后的代码将继续运行,而 loadValuesAsynchronouslyForKeys 执行其操作...当值准备好时(稍后),您的闭包运行。在这种情况下,您在关闭后没有任何代码,因此您的 title() 方法预计在 loadValuesAsynchronouslyForKeys 调用之后立即返回,除非您还没有放置 return 语句,这样在解决第一个错误后,您就会收到另一个编译错误。

有一些方法可以在同步调用中隐藏异步内容 - 例如,您可以阻止,或者您可以有一个返回值,表示“一旦我加载了我的值,请稍后重试”,或者您可以这样做提前,以便在您调用 getter 时它已准备就绪...您必须计划一个适合您的方法。或者直接使用异步键值加载。

关于swift - 使用 AVMetadataItem.value 快速获取媒体标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34447087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com