2011-12-05 4 views
8

一見したところ、簡単な質問のように思えましたが、特定のバックグラウンドスレッドで匿名ブロックを実行する方法を特定できません。つまり、-performSelector:onThread:withObject:waitUntilDone:特定のバックグラウンドスレッドで匿名ブロックを実行する

関連:メインキューがアプリケーションのメインスレッドに関連付けられているように、ディスパッチキューを特定のバックグラウンドスレッドに関連付けることはできますか?

編集は、私はブロックが関数の無名ブロック

答えて

6

私はマイク・アッシュのPLBlocksPlayground(zipファイル、BlocksAdditions.mを参照)で、最近、この機能RunOnThread()を見た:

void RunOnThread(NSThread *thread, BOOL wait, BasicBlock block) 
{ 
    [[[block copy] autorelease] performSelector: @selector(my_callBlock) onThread: thread withObject: nil waitUntilDone: wait]; 
} 

これは私が探していたものです。

PLBlocksPlaygroundには、他の非常に有用なブロック関連のユーティリティがたくさんありますが、そのほとんどはAsh氏がこのpostで説明しています。

+0

リンクが壊れているように見えますが、コンテンツがどこにあるのか誰にでも分かりますか? – nmr

+0

コンテンツがどこにあるのか分かりません。私はこれについてMike Ash(PLBlocksPlaygroundの著者)に尋ねました。うまくいけば、すぐに新しい場所を知ることができます。 –

+1

リンクを更新しました。ダウンロードできるzipファイルを指しています。 –

-1

を実行するために探していますことを明らかにしました。他の機能を呼び出すように呼び出します。

+0

私はバックグラウンドスレッドで無名ブロックを実行しようとしていました。 –

7

私は右のあなたを理解していれば、あなたがこれを行う必要があります。

dispatch_queue_t thread = dispatch_queue_create("your dispatch name", NULL); 
dispatch_async(analyze, ^{ 
    //code of your anonymous block 
}); 
dispatch_release(thread); 

あなたはまた、それにブロックを取るであろう、いくつかのメソッドを書くことができますが、あなたはそれが保持されますパラメータの種類を知っている必要があります:

-(void)performBlock:(void (^)(SomeType par1, SomeType par2))block ToData:(Sometype)data; 

あなたが無名ブロックでそれを呼び出すことができます。

[something performBlock:^(SomeType par1, SomeType par2){ 
    //do your stuff 
} ToData: data] 

そして、この方法では、あなたのBLを呼び出すことができます簡単なCの関数としてOCK:

block(par1, par2); 
+3

ディスパッチキューがどのスレッドで実行されているかについてGCDが保証しているとは思いません。私はあなたの最初のソリューションが動作するとは思わない。第二の解決策はもっと面白いです。私はそれがうまくいくと思います - それを試して更新します。 –

+0

@ChaitanyaGuptaが正しいです。 dispatch_queueはスレッドと同じではありません。 dispatch_queueは任意の数のスレッドで実行できます。 – bandejapaisa

関連する問題