私はこのようないくつかのメソッド呼び出しを持っています:別のスレッドでコードを実行するにはどうすればよいですか?
[self myFoo];
[self heavyStuff]; // this one in other thread
[self myBar];
どのクラス/メソッドを見なければなりませんか?私が "スレッド"を検索すると、たくさんのクラス、メソッド、関数があります。ここで最も適切なのはどちらですか?
私はこのようないくつかのメソッド呼び出しを持っています:別のスレッドでコードを実行するにはどうすればよいですか?
[self myFoo];
[self heavyStuff]; // this one in other thread
[self myBar];
どのクラス/メソッドを見なければなりませんか?私が "スレッド"を検索すると、たくさんのクラス、メソッド、関数があります。ここで最も適切なのはどちらですか?
あなたは
[self performSelectorInBackground:@selector(heavyStuff) withObject:nil];
を行うだろうが、AppleのサイトでNSObjectのreferenceを参照してください。
あなたは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];
を "火と忘れて"、[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]
を使用することができます。
ここではたくさんの素晴らしい情報がありますが、Threading Programming Guideで時間を過ごすことを忘れないでください。これは、テクノロジだけでなく、並行処理の優れた設計と、スレッドとスレッドの両方で実行ループをうまく活用する方法についての良い指針を提供します。
あなたが独占的に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で動作します。
NSOperationはSnow LeopardでもGCDを使用しており、ブロックを使用できるようにNSBlockOperationサブクラスを含んでいます。 – Chuck
performSelectorInBackroundに 'g'がありません。 – Erich
が修正されました。ありがとう@ Erich。 –