2009-05-28 12 views
9

私はこのようないくつかのメソッド呼び出しを持っています:別のスレッドでコードを実行するにはどうすればよいですか?

[self myFoo]; 
[self heavyStuff]; // this one in other thread 
[self myBar]; 

どのクラス/メソッドを見なければなりませんか?私が "スレッド"を検索すると、たくさんのクラス、メソッド、関数があります。ここで最も適切なのはどちらですか?

答えて

20

あなたは

[self performSelectorInBackground:@selector(heavyStuff) withObject:nil]; 

を行うだろうが、AppleのサイトでNSObjectのreferenceを参照してください。

4

あなたはNSOperationQueueとNSInvocationOperation使用することができますについて

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                 selector:@selector(heavyStuff) object:nil]; 
[operationQueue addOperation:operation]; 

[self myBar]; 
15

を "火と忘れて"、[self performSelectorInBackground:@selector(heavyStuff) withObject:nil]を試してみてください。このような操作が複数ある場合は、NSOperationとそのサブクラスNSInvocationOperationをチェックしてください。 NSOperationQueueマネージスレッドプーリング、同時に操作を実行すると通知が含まれる場合、またはすべての操作が完了したあなたに伝え方法を阻止するの数:低いレベルで

[self myFoo]; 

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self                                 selector:@selector(heavyStuff) object:nil]; 

[operationQueue addOperation:operation]; 
[operation release]; 

[self myBar]; 

... 

[operationQueue waitUntilAllOperationsAreFinished]; //if you need to block until operations are finished 

、あなたが使用-[NSThread detachNewThreadSelector:@selector(heavyStuff) toTarget:self withObject:nil]を使用することができます。

+0

performSelectorInBackroundに 'g'がありません。 – Erich

+0

が修正されました。ありがとう@ Erich。 –

7

ここではたくさんの素晴らしい情報がありますが、Threading Programming Guideで時間を過ごすことを忘れないでください。これは、テクノロジだけでなく、並行処理の優れた設計と、スレッドとスレッドの両方で実行ループをうまく活用する方法についての良い指針を提供します。

7

あなたが独占的にSnow Leopardのをターゲットにしている場合は、グランドセントラル派遣を使用することができます。

[self myFoo]; 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self heavyStuff]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self myBar]; 
    }); 
}); 

しかし、それは以前のシステム(またはiPhone)上で実行すると、おそらく過剰ですません。

EDIT:iOS 4.xからiPhoneで動作します。

+0

NSOperationはSnow LeopardでもGCDを使用しており、ブロックを使用できるようにNSBlockOperationサブクラスを含んでいます。 – Chuck

関連する問題