URLSession.shared.downloadTask
リクエストを実行しましたが、downloadTask
が実行されたのと同じスレッドでコードを実行したいとします。例:スレッドインスタンスでブロックを実行するには?
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
someFunc() //How to execute on thread variable?
}.resume()
}
完了ハンドラでは、バックグラウンドスレッドで実行されています。しかし、someFunc()
と同じスレッドsample()
が呼び出されました。私はThread.current.async {...}
のようなものは、私はこれを行うことができますするにはどうすればよい:あなたは、特定のThread
上で何かを実行したい場合は
func sample() {
let thread = Thread.current
URLSession.shared.downloadTask(with: file) {
thread.async { someFunc() } //Doesn't compile
}.resume()
}
これは問題を解決する可能性がありますが、スレッドは非常に低レベルで複雑です。 'perform on:'を介してこの特定のスレッドに渡される 'sample'メソッドの呼び出しを変更する必要があります。 'sample'と' someFunc'の間の他のスレッドによって作成されたアウトオブオーダーのイベントに対処しなければならないかもしれません...同じ方法は、 'OperationQueue'のような高レベルのAPIを使用してアーカイブすることができます。 – andih
私は同意します。なぜなら、「できればGCDを使用する」ことで閉じたからです。しかし、これは操作キューの良いユースケースではありません。そして、あなたの答えのように、呼び出しスレッドをブロックすることは決して良い考えではありません。 – Rob
あなたが正しいです、ブロックアプローチは避けなければなりません。ブロッキングを回避する別のアプローチは、依存する操作を使用することです。 – andih