2016-08-04 8 views
1

나는 이것에 대해 어떤 문서를 발견했지만, (URL이 HLS 라이브 스트림에 대한 원격 URL 임) 네트워크가 다운 또는 일부의 경우 내 실제 경험에AVURLAsset URLAssetWithURL : options : 원격 URL로 메인 스레드를 차단 하시겠습니까?

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; 

, 메인 스레드를 차단합니다 파일을 읽을 수없는 이유.

누구나 눈치 채셨습니까? 배경 설정 스레드에서 GCD를 사용하도록 설정이 변경 될 수 있습니다. 왜냐하면 UI는 동영상을로드 할 수 없으면 언제든지 잠글 수 있기 때문입니다.

AVPlayerItem은 일을 비동기 적으로로드하지만 AVURLAsset은 그렇게하지 않습니다.

답변

0

이 문제도 발생했습니다. 다음과 같이 해결 :

let asset = AVURLAsset(url: url) 

// I'm using a resource loader for my custom urls... 
let loaderQueue = DispatchQueue(label: "loader-queue", qos: .userInteractive) 
asset.resourceLoader.setDelegate(self, queue: self.loaderQueue) 

// load values asynchronously and once complete, create the player item 
let keys = ["duration", "tracks"] 
asset.loadValuesAsynchronously(forKeys: keys, completionHandler: { 
    let item = AVPlayerItem(asset: asset) 
    self.player.insert(item, after: nil) 
})