使用 AVMetadataItem.value 在 swift 中获取媒体标题

use AVMetadataItem.value to get media title in swift

我想通过AVMetadataItemclass

获取媒体标题
 /* provides the value of the metadata item */
    @NSCopying public var value: protocol<NSCopying, NSObjectProtocol>? { get }

以上为苹果官方说明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;
        }

    }   
};
}
}

然后我在使用 'as' 执行类型转换的地方出现错误 'Unexpected non-void return value in void function'

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

这意味着闭包不能return代表你写的函数。闭包本身有一个void return类型,所以你不能return 它的一个值(因此您看到的错误消息)。

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

调用 loadValuesAsynchronouslyForKeys 后,关闭后的代码继续 运行 而 loadValuesAsynchronouslyForKeys 执行其操作...当值准备就绪时(一段时间后),您的关闭运行。在这种情况下,您在关闭后没有代码,所以您的 title() 方法期望在 loadValuesAsynchronouslyForKeys 调用之后立即 return,除非您没有在那里放置 return 语句所以一旦你解决了第一个错误,你就会得到另一个编译错误。

有一些方法可以在同步调用中隐藏一些异步的东西——例如,你可以阻塞,或者你可以有一个 return 值表示 "try again later once I've loaded my value",或者你可以提前做的时间,以便在您致电 getter 时准备就绪...您必须计划一个适合您的计划。或者直接使用异步键值加载。