41758
「URLから動画の取得が終了したら」という条件つきで実行したい処理があります。  
(動画の取得中には実行したくない)

このような処理を実装する場合に、どのような方法が考えられますか。  
以下のように非同期処理で実現しようとしたところ、クラッシュしました。

```

    DispatchQueue.global().sync {
    
       let url = URL(string: "http://movie.mov")
       let player = AVPlayer(url: url!)
       let playerViewController = AVPlayerViewController()
       playerViewController.player = player
       let playerLayer = AVPlayerLayer(player: videoPlayer)
       self.view.layer.addSublayer(playerLayer)
       player.play()
    
       DispatchQueue.main.sync {
    　　　//ここで処理を実行したい
       }
    }
    
```
CC BY-SA 3.0
2018-02-15T08:02:36.040
41728
2018-02-16T01:49:24.340
18443
question
swift
「URLから動画の取得が終了したら」という条件つきで実行したい処理
動画の取得を別スレッドで、UIの更新系の処理をmainスレッドで処理です。  
syncやasyncの中に書かれた処理は普通に上から下に向けて処理されます。  
下のようにすることで動画を取得してからデータ/UIの更新となります。

```

    // ここは一般的には非同期 async で実行します
    // 同期的でよい場合はDispatchQueueを使う必要はありません。
    DispatchQueue.global().async {
        //ここでURLから動画の取得
    
        // ここはasyncでもsyncでもOK。　下に違いを記述。
        DispatchQueue.main.sync {
            // ここでデータの更新とUIの更新
        }
    
        // DispatchQueue.main.syncの場合、ここに処理があれば、DispatchQueue.main.syncの実行後に処理される
    
        // DispatchQueue.main.asyncにした場合、ここに処理があれば非同期に実行される
    }
    
```
CC BY-SA 3.0
2018-02-16T01:49:24.340
41758
2018-02-16T01:49:24.340
2741
41728
answer