1

我想通过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 函数中出现意外的非 void 返回值”,我使用“as”执行类型转换

4

1 回答 1

1

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

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

这也意味着你不能真正在你的title()方法中隐藏一个异步过程......至少,不是那么简单。

在你调用之后loadValuesAsynchronouslyForKeys,你的代码在闭包之后继续运行,同时loadValuesAsynchronouslyForKeys做它的事情......当值准备好(一段时间后),你的闭包运行。在这种情况下,您在关闭后没有代码,因此您的title()方法希望在loadValuesAsynchronouslyForKeys调用后立即返回,除非您没有在此处放置return语句,因此一旦您解决第一个编译错误,您就会收到另一个编译错误。

有一些方法可以在同步调用中隐藏一些异步的东西——例如,你可以阻塞,或者你可以有一个返回值说“一旦我加载了我的值,稍后再试”,或者你可以提前做这样当你调用吸气剂时它就准备好了......你必须计划一个适合你的。或者直接使用异步键值加载。

于 2015-12-24T20:21:25.863 回答