マルチスレッド&NSObject&NSThread&NSOperation&GCD
5009 ワード
1、NSThreadはNSThreadオブジェクトごとに1つのスレッドに対応し、軽量(本格的なマルチスレッド)以下の2点はアップルが専門的に開発した「同時」技術であり、プログラマーがスレッドの具体的な使用問題に関心を持たなくなる2、NSOperation/NSOperation/NSOperationQueueオブジェクト向けスレッド技術3、GCD-Grand Central Dispatch(配布)はC言語ベースのフレームワークであり、マルチコアを十分に利用することができる.アップルが推奨するマルチスレッドテクノロジーです
以上の3つのプログラミング方式は上から下まで、抽象度階層は低から高まで、抽象度が高いほど使いやすく、Appleが最も推奨しています.しかし、iOSの開発者は、3つのマルチスレッド技術の基本的な使用過程を理解する必要があります.多くのフレームワーク技術では、異なるマルチスレッド技術が使用されているからです.
NSThread:利点:NSThreadは他の2つの軽量レベルよりも使いやすい欠点:スレッドのライフサイクル、スレッド同期、ロック、睡眠、目覚ましなどを自分で管理する必要がある.スレッド同期はデータのロックに対して一定のシステムオーバーヘッドNSOperationがあります:スレッド管理に関心を持つ必要はありません.データ同期のことは、自分が実行する必要がある操作に集中することができます.NSOperationはオブジェクト向けGCD:Grand Central Dispatchはアップルが開発したマルチコアプログラミングのソリューションです.iOS4.0+を使用することができ、NSThreadの代わりに、NSOperationの効率的で強力な技術GCDはC言語に基づいています.
NSObjectのマルチスレッドメソッド——バックグラウンドスレッド(void)performSelectorInBackground:(SEL)aSelector withObject:(id)argは通常、スレッド管理が比較的煩雑であるため、時間のかかるタスクの多くは正確な完了時間を知ることができないため、performSelectorInBackgroundメソッドを使用してバックグラウンドスレッドを直接新規作成し、セレクタで指定したタスクをスレッドのバックグラウンドで実行することができます.具体的なNSThreadオブジェクトのヒントに関心を持つ必要はありません:performSelectorInBackgroundメソッド自体はメインスレッドで実行され、セレクタが指定するメソッドはバックグラウンドスレッドで行われるperformSelectorInBackgroundメソッドを使用して呼び出されたタスクでUIインタフェースを更新することができます. (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; UIインタフェースを更新する場合は、バックグラウンドスレッドでperformSelectorOnMainThreadメソッドヒントを呼び出すことができます.performSelectorInBackgroundメソッドを使用して呼び出されたタスクはUIインタフェースを更新することができますが、実際の開発ではUIインタフェースの更新操作に関連するか、performSelectorOnMainThreadメソッドを使用するか、不要なトラブルを回避するために
NSThreadスレッド作成方法: (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; パラメータの説明:selector:スレッド実行の方法で、パラメータは1つしかありません.戻り値target:selectorメッセージ送信のオブジェクトargumentはありません.targetに転送される唯一のパラメータでも、nil//メンバーメソッドNSThread*thread=[[NSThread alloc]initWithTarget:self selector:@selector(bigDemo)object:nil];//startスレッド[thread start];
NSOperation&NSOperationQueue NSOperationの2つのサブクラスNSInvocationOperation NSBlockOperationの動作原理:実行する操作をNSOperationでカプセル化すると、作成したNSOperationオブジェクトがNSOperationQueueに格納され、OperationQueueを起動して新しいスレッド実行キューでの操作を開始する注意事項:マルチスレッドを使用する場合、通常はスレッドの同時数を制御する必要があります.スレッドはシステムリソースを消費するため、同時に実行されるスレッドが多すぎると、システムは遅くなります.以下の方法で、同時スレッドの数を制御できます.(void)s t e t MaxConcurrentOperationCount:(NSInteger)cnt;
//[op1 start];
GCDはC言語に基づくフレームワークの動作原理である:プログラムを平行にキューさせる特定のタスクは、利用可能な処理リソースに基づいて、任意の利用可能なプロセッサ上でタスクを実行するために手配されるタスクが実行される関数であってもよいし、blockの下位層でスレッドによって実現されてもよいが、プログラマは実装の詳細GCDのFIFOキューをdispatch queueと呼ぶ必要はない.先進的なタスクが先にdispatchを実行することを保証することができます.notifyは、タスクのセットが完了したかどうかをリスニングし、完了後にGCDキューに通知することができます.グローバルキュー:プライマリ・キューに追加されたすべてのタスクは、同時実行のシリアル・キューです.シリアル・キューに追加されたすべてのタスクは、順次実行されるプライマリ・キューです.プライマリ・キューに追加されたすべてのタスクは、プライマリ・スレッドで実行されます.
グローバルキュー(複数のスレッドが開く場合があります)dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); シリアルキュー(スレッドが1つしか開かない)dispatch_queue_t queue = dispatch_queue_create(“myQueue”, DISPATCH_QUEUE_SERIAL); プライマリ・キューdispatch_get_main_queue();
非同期アクションdispatch_asyncが他のスレッドでタスクを実行すると、新しいスレッド非同期メソッドが開き、タスクの実行順序を決定できません.同期操作dispatch_sync現在現在現在、現在のスレッドでタスクが実行されている場合、キューに関係なく新しいスレッド同期を開始しない同期メソッドが順次実行され、タスクの実行順序を決定してインタフェースUIを更新できる場合は、同期メソッドを使用することが望ましい
GCDの利点:マルチコアのすべてのマルチスレッドコードを十分に利用し、GCDのメンテナンスを容易にする@autoreleasepoolを使用する必要がない@autoreleasepoolを使用する場合は、dispatch_を使用することができます.sync同期方法dispatch_asyncはタスクの実行順序を決定できません
以上の3つのプログラミング方式は上から下まで、抽象度階層は低から高まで、抽象度が高いほど使いやすく、Appleが最も推奨しています.しかし、iOSの開発者は、3つのマルチスレッド技術の基本的な使用過程を理解する必要があります.多くのフレームワーク技術では、異なるマルチスレッド技術が使用されているからです.
NSThread:利点:NSThreadは他の2つの軽量レベルよりも使いやすい欠点:スレッドのライフサイクル、スレッド同期、ロック、睡眠、目覚ましなどを自分で管理する必要がある.スレッド同期はデータのロックに対して一定のシステムオーバーヘッドNSOperationがあります:スレッド管理に関心を持つ必要はありません.データ同期のことは、自分が実行する必要がある操作に集中することができます.NSOperationはオブジェクト向けGCD:Grand Central Dispatchはアップルが開発したマルチコアプログラミングのソリューションです.iOS4.0+を使用することができ、NSThreadの代わりに、NSOperationの効率的で強力な技術GCDはC言語に基づいています.
NSObjectのマルチスレッドメソッド——バックグラウンドスレッド
- (IBAction)bigTask
{///本方法のすべてのコードはメインスレッドで実行される///NSObjectマルチスレッド技術NSLog(@「実行前->%@」,[NSThread currentThread]);///performSelectorInBackgroundはbigDemoのタスクをバックグラウンドスレッドで実行する[self performSelectorInBackground:@selector(bigDemo)withObject:nil];NSLog(@「実行後->%@」,[NSThread currentn n n n n n n t t t:nil],[NSNSThread currententent@ n],[NSThead currentr r r r r r r r r n n n n n n t Thread);//[self bigDemo]; NSLog(@「実行完了」);}NSThreadスレッド作成方法:
NSOperation&NSOperationQueue NSOperationの2つのサブクラスNSInvocationOperation NSBlockOperationの動作原理:実行する操作をNSOperationでカプセル化すると、作成したNSOperationオブジェクトがNSOperationQueueに格納され、OperationQueueを起動して新しいスレッド実行キューでの操作を開始する注意事項:マルチスレッドを使用する場合、通常はスレッドの同時数を制御する必要があります.スレッドはシステムリソースを消費するため、同時に実行されるスレッドが多すぎると、システムは遅くなります.以下の方法で、同時スレッドの数を制御できます.(void)s t e t MaxConcurrentOperationCount:(NSInteger)cnt;
<!-- lang: cpp -->
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction) object:nil];
// start,
//[op1 start];
<!-- lang: cpp -->
[_queue addOperation:op1];
<!-- lang: cpp -->
// block , , ,
[_queue addOperationWithBlock:^{
NSLog(@"%@", [NSThread currentThread]);
//
[NSThread sleepForTimeInterval:1.0f];
//
UIImage *image = [UIImage imageNamed:@" 1"];
// ,
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
_imageView.image = image;
}];
}];
GCDはC言語に基づくフレームワークの動作原理である:プログラムを平行にキューさせる特定のタスクは、利用可能な処理リソースに基づいて、任意の利用可能なプロセッサ上でタスクを実行するために手配されるタスクが実行される関数であってもよいし、blockの下位層でスレッドによって実現されてもよいが、プログラマは実装の詳細GCDのFIFOキューをdispatch queueと呼ぶ必要はない.先進的なタスクが先にdispatchを実行することを保証することができます.notifyは、タスクのセットが完了したかどうかをリスニングし、完了後にGCDキューに通知することができます.グローバルキュー:プライマリ・キューに追加されたすべてのタスクは、同時実行のシリアル・キューです.シリアル・キューに追加されたすべてのタスクは、順次実行されるプライマリ・キューです.プライマリ・キューに追加されたすべてのタスクは、プライマリ・スレッドで実行されます.
グローバルキュー(複数のスレッドが開く場合があります)dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); シリアルキュー(スレッドが1つしか開かない)dispatch_queue_t queue = dispatch_queue_create(“myQueue”, DISPATCH_QUEUE_SERIAL); プライマリ・キューdispatch_get_main_queue();
非同期アクションdispatch_asyncが他のスレッドでタスクを実行すると、新しいスレッド非同期メソッドが開き、タスクの実行順序を決定できません.同期操作dispatch_sync現在現在現在、現在のスレッドでタスクが実行されている場合、キューに関係なく新しいスレッド同期を開始しない同期メソッドが順次実行され、タスクの実行順序を決定してインタフェースUIを更新できる場合は、同期メソッドを使用することが望ましい
GCDの利点:マルチコアのすべてのマルチスレッドコードを十分に利用し、GCDのメンテナンスを容易にする@autoreleasepoolを使用する必要がない@autoreleasepoolを使用する場合は、dispatch_を使用することができます.sync同期方法dispatch_asyncはタスクの実行順序を決定できません
<!-- lang: cpp -->
// 1.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2. ( )
dispatch_async(queue, ^{
NSLog(@"a->%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"b->%@", [NSThread currentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main - > %@", [NSThread currentThread]);
});