我想通过AVMetadataItem类获得媒体标题
/* 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;
}
}
};
}
}然后,我得到错误‘在void函数中意外的非空返回值’,其中我使用‘作为’执行类型转换。
发布于 2015-12-24 20:21:25
紧跟在loadValuesAsynchronouslyForKeys之后的大括号是一个闭包,它是该方法的completionHandler参数。正如该方法的名称所示,它是一个异步操作。
这意味着闭包不能代表您写入的函数return。闭包本身有一个空返回类型,所以您不能从它返回一个值(因此您看到了错误消息)。
这也意味着您不能在title()方法中真正隐藏异步进程.至少不是这么简单。
调用loadValuesAsynchronouslyForKeys之后,关闭后的代码继续运行,而loadValuesAsynchronouslyForKeys则继续运行.当这些值准备好(一段时间后),您的闭包就会运行。在本例中,闭包后没有代码,因此title()方法希望在loadValuesAsynchronouslyForKeys调用后立即返回,但没有在其中放置return语句,因此一旦解决第一个编译错误,就会得到另一个编译错误。
有一些方法可以在同步调用中隐藏异步的东西--例如,您可以阻止它,或者您可以有一个返回值,上面写着“我加载了值之后再试一次”,或者您可以提前完成它,这样在调用getter时它就准备好了.你得计划一个对你有用的。或者直接使用异步键值加载。
https://stackoverflow.com/questions/34447087
复制相似问题