使用 AVMetadataItem.value 在 swift 中获取媒体标题
use AVMetadataItem.value to get media title in swift
我想通过AVMetadataItem
class
获取媒体标题
/* 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 时准备就绪...您必须计划一个适合您的计划。或者直接使用异步键值加载。
我想通过AVMetadataItem
class
/* 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 时准备就绪...您必须计划一个适合您的计划。或者直接使用异步键值加载。