2017-03-07 14 views
1

に特定のスレッドからのコードを実行:は、私はこのような機能を持っていスウィフト

func foobar() { 
    let targetThread = Thread.current 

    DispatchQueue.main.async { 
    UIView.animate(withDuration: 0.5, animations: { 
     // Code I need to run on the main thread 
    }, completion: { 
     // Code I want to run on targetThread -- HOW? 
    } 
    } 
} 

どのように私はtargetThreadからコードを実行するのですか?ありがとう。

+0

現在実行中のスレッドを使用する代わりに、新しいスレッドを作成する方がよいでしょう。メソッドの外部にアクセスし、このメソッドを呼び出すときにメソッドを起動します。 class var current:Thread 現在の実行スレッドを表すスレッドオブジェクトを返します。 – Deepak

+0

特定のスレッドでコードを実行する必要があるのはなぜですか?あなたはする必要はありません、そして、これは落胆します。あなたはおそらく 'DispatchQueue.global()。async'を補完ブロックに入れてそこでコードを実行したいのですが、コードを目的のスレッドで実行させたい理由を教えてください。 – Alistra

+1

デリゲートが呼び出された同じスレッドでデリゲートを呼び出すことは非常に一般的です。残念ながら、gcdはそれを実際にサポートしていません。 NSObjectのperformSelector:onThreadは使用できますが、きれいなAPIではありません。私は、プログラムがperformSelector:onThreadを使用する独自のperformBlock:onThreadメソッドを持っているのを見ました。 – EricS

答えて

1

DispatchQueueはスレッドではありません。あなたは現在のスレッドを得る方法を現在のDispatchQueueにする方法がないことに注意してください。あなただけのメインスレッドではないどこかのコードを実行したい場合は、あなたが使用することができます。

DispatchQueue.global().async { ... }

をあなたが本当にあなたの特定のスレッドをターゲットにする場合は、2つの選択肢があります。

最初にNSObjectperform(_:on:with:waitUntilDone:)(または関連する方法の1つ)を使用して、あなたが得たNSThreadを渡すことができます。あなたの質問に文脈が足りないため、これがあなたのために働くか、例を挙げることができますが、あなたは検索することができます。

NSOperationQueueを使用するには、このすべてを開始しているので、foobar()NSOperationQueue上の操作で実行されるだろうし、その後、アニメーションのためのあなたの完了で、あなたは別のNSOperationのスケジュールを設定したい再働くあなたのコードにあります同じ操作待ち行列上で実行する。ディスパッチキューを直接使用することもできます。つまり、独自のディスパッチキューを作成し、foobarをディスパッチしてから、アニメーションが完了するとmainからキューにディスパッチします。

関連する問題