2010-12-12 10 views
3

performSelectorInBackground:...をバックグラウンドで実行しているメソッドから呼び出すと、実際にどのような効果がありますか?私はそれが例えば非同期performSelectorInBackground:backgroundスレッドから

を実行したい:

- (void) _imageBufferWasUpdated{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //do something here 

    if(shouldContinue){ 
     [self performSelectorInBackground:@selector(_loop) withObject:nil]; 
    } 
    [pool release]; 
} 

は_imageBufferWasUpdatedはバックグラウンドで実行され、私は(そう_imageBufferWasUpdatedはおそらく_loop終了する前に、すぐに終了しますまた、バックグラウンドで)非同期メソッドを_loop呼び出したいです。

これは間違いありませんか?

GCDを使用して効率的(かつ比較的簡単)な方法がありますか? GCDを使用してこれをフォークする方法の例をいくつか挙げていただければ幸いです。私は_imageBufferWasUpdatedと_loopのための他のバックグラウンドスレッドを実行するための少なくとも3つのスレッド、メインスレッド、バックグラウンドスレッドが必要だと思います。私は正しいですか?バックグラウンドスレッドへ事前に

おかげで イグナシオ

+0

私を助けてください! ;)バックグラウンドスレッドでの処理が非常に遅く、これが理由であるかどうかわかりません... – nacho4d

答えて

2

あなたがしていることは私にとってはうまくいくようです。ココアはたぶん単一のバックグラウンドスレッドを使用しているため、過剰なスレッドの作成につながるべきではありません。

さらに制御したい場合は、NSOperationまたはGCDを使用できます。両方ともかなりシンプルです。例えば、GCDはこのようになるでしょう

#import <dispatch/dispatch.h> 

... 

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    [self _loop]; 
}]; 
+0

これは単一のバックグラウンドスレッドを使用することはできません。そうすることで、すぐにデッドロックが発生します。 – bbum

+0

私はdispatch_get_global_queueを使用すると_loopがメインスレッドで実行され、そのループは他のものと非常に混み合っているので、これは私が欲しいものではないと思います。 performSelectorOnMainThreadのようなものではないでしょうか... performSelectorOnBackgroundThreadではなく? – nacho4d

+0

デフォルトのグローバルキューは、メインスレッドでは実行されません。あなたはそれを行うためのメインキューを要求します。デフォルトキューはバックグラウンドスレッドで実行されます。 –

1

performSelectorInBackgroundフォークあなたのセレクタ。 [documentation]

私は正しいかどうか分かりませんが、GCDまたはその上位レベルのクラス(NSOperationQueue)を使用してすべてを行う必要があります。システムが多すぎるスレッドで飽和し、十分な計算リソースを持たない場合、バックグラウンドスレッドが多すぎるとパフォーマンスが低下する可能性があります。

GCDは、使用可能なシステムリソースに基づいて同時に動作するスレッドの数を自動的に管理します。

+0

ありがとう、ジェレミー、私はGCDを試します;) – nacho4d

関連する問題