首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AVMetadataItem.value快速获取媒体标题

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

Stack Overflow用户
提问于 2015-12-24 04:01:50
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
复制
 /* provides the value of the metadata item */
    @NSCopying public var value: protocol<NSCopying, NSObjectProtocol>? { get }

以上是苹果公司关于value属性的官方说明

代码语言:javascript
复制
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函数中意外的非空返回值’,其中我使用‘作为’执行类型转换。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 20:21:25

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

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

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

调用loadValuesAsynchronouslyForKeys之后,关闭后的代码继续运行,而loadValuesAsynchronouslyForKeys则继续运行.当这些值准备好(一段时间后),您的闭包就会运行。在本例中,闭包后没有代码,因此title()方法希望在loadValuesAsynchronouslyForKeys调用后立即返回,但没有在其中放置return语句,因此一旦解决第一个编译错误,就会得到另一个编译错误。

有一些方法可以在同步调用中隐藏异步的东西--例如,您可以阻止它,或者您可以有一个返回值,上面写着“我加载了值之后再试一次”,或者您可以提前完成它,这样在调用getter时它就准备好了.你得计划一个对你有用的。或者直接使用异步键值加载。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34447087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档