2015-12-24 2 views
0

Я хочу получить название СМИ через AVMetadataItem классаиспользование AVMetadataItem.value получить название СМИ в быстром

/* provides the value of the metadata item */ 
    @NSCopying public var value: protocol<NSCopying, NSObjectProtocol>? { get } 

Выше Apple, официальный иллюстрировать о 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 «где я использую» как «выполнять литье типа

+0

Возможный дубликат [Avmetadataitem Получение трека из метаданных iTunes или ID3 на iOS] (http://stackoverflow.com/questions/10292913/avmetadataitem-getting-the-tracknumber-from-an-itunes-or-id3 -metadata-on-ios) –

ответ

1

Скобки, которые сразу следуют loadValuesAsynchronouslyForKeys ar e замыкание, которое является параметром completionHandler для этого метода. Как следует из названия этого метода, это асинхронная операция.

Это означает, что закрытие не может return от имени функции, в которую вы ее записываете. У самого закрытия есть тип возврата void, поэтому вы не можете вернуть его (следовательно, сообщение об ошибке) ,

Это также означает, что вы не можете скрыть асинхронный процесс внутри вашего метода title() ... по крайней мере, не так просто.

После того, как вы позвоните loadValuesAsynchronouslyForKeys, ваш код после закрытия продолжает работать, пока loadValuesAsynchronouslyForKeys делает свою вещь ... Когда значения готовы (через некоторое время), ваше закрытие запускается. В этом случае у вас нет кода после закрытия, поэтому ваш метод title() рассчитывает вернуться сразу после вызова loadValuesAsynchronouslyForKeys, за исключением того, что вы не поставили там return, так что вы получите еще одну ошибку компиляции, как только вы разрешите первый ,

Есть несколько способов скрыть что-то асинхронное внутри синхронного вызова - например, вы можете заблокировать или вы можете получить возвращаемое значение, которое говорит: «Повторите попытку позже после загрузки моего значения» или вы можете сделать это заранее, чтобы он был готов, когда вы вызываете геттер ... Вам придется запланировать тот, который работает на вас. Или просто используйте асинхронную загрузку ключа-значения напрямую.

+0

Вы правы, я новичок в swift.I проигнорировал 'loadValuesAsynchronouslyForKeys' API имеет параметр закрытия, что такое асинхронная операция –