iOS-NSThread、NSOperation、GCDの違い

4356 ワード

1.iOSの3種類のマルチスレッド技術

  • 1.NSThread各NSThreadオブジェクトは1つのスレッドに対応し、軽量(真のマルチスレッド)
  • 2.次の2つの点は、アップルが開発した「同時」技術であり、プログラマーがスレッドの具体的な使用問題
  • に関心を持たなくてもよい.
  • NSOperation/NuperationQueueオブジェクト向けスレッド技術
  • GCD-Grand Central Dispatch(ディスパッチ)はC言語ベースのフレームワークであり、マルチコアを十分に利用することができ、アップルが推奨するマルチスレッド技術
  • である.
    以上の3つのプログラミング方式は上から下へ、抽象度階層は低から高へ、抽象度が高いほど使用が簡単で、Appleが最も推奨しているもので、プロジェクトでは多くのフレームワーク技術が異なるマルチスレッド技術を使用しています.

    2.三種類のマルチスレッド技術の比較

  • NSThread:
  • の利点:NSThreadは他の2つの軽量レベルよりも簡単な
  • を使用する
  • の欠点:スレッドのライフサイクル、スレッドの同期、ロック、睡眠、目覚ましなどを自分で管理する必要があります.スレッド同期によるデータのロックには、一定のシステムオーバーヘッド
  • がある.
  • NSOperation:
  • スレッド管理、データ同期に関心を持つ必要はなく、自分が実行する必要がある操作に集中することができる
  • .
  • NSOperationはオブジェクト向けの
  • である.
  • GCD:
  • Grand Central Dispatchは、アップルが開発したマルチコアプログラミングのソリューションです.iOS4.0+を使用できるのは、NSThread、NSOperationに代わる効率的で強力なテクノロジー
  • です.
  • GCDはC言語に基づく
  • 3.三種類のマルチスレッド技術の実現


    3.1 NSThreadのマルチスレッド技術
  • クラスメソッドはバックグラウンドスレッドを直接開き、セレクタメソッドを実行します:detachNewThreadSelector新規スレッドを作成し、@selectorメソッド[NSThread detachNewThreadSelector:@selector(bigDemo)toTarget:self withObject:nil]を呼び出します.
  • メンバーメソッドスレッドオブジェクトをインスタンス化した後、startを使用してセレクタメソッドを実行する必要があります:initWithTargetメンバーメソッドNSThread*thread=[[NSThread alloc]initWithTarget:self selector:@selector(bigDemo)object:nil];//startスレッド[thread start];NSThreadの簡単な使用では、performSelectorInBackgroundの代わりにNSObjectのperformSelectorInBackgroundを使用できます.bigDemoのタスクをバックグラウンドスレッドに配置して実行します.[self performSelectorInBackground:@selector(bigDemo)withObject:nil];また、NSThread呼び出しのメソッドでもautoreleasepoolを使用してメモリ管理を行う必要があります.そうしないと、メモリ漏洩
  • が発生しやすくなります.
    3.2 NSOperation、オブジェクト向けマルチスレッド技術
  • 使用手順:インスタンス化操作インスタンス化操作キュー_queue = [[NSOperationQueue alloc] init]; インスタンス化操作NSInvocationOperation
  •   NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction) object:nil];
      //  start, 
      // [op1 start];
      //  , 7
       [_queue addOperation:op1];
    

    インスタンス化操作NSBlockOperation
    #pragma mark   
     - (IBAction)operationDemo3:(id)sender { 
           // 1.   
            NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ 
                 NSLog(@"  %@" , [NSThread currentThread]); 
            }]; 
           // 2.   
           NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
                NSLog(@"  %@" , [NSThread currentThread]);
             }];
            // 3.  
            NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
                NSLog(@" UI %@" , [NSThread currentThread]);
            }];
             //  , “ ” , , 
             //  
              //  : , , 。
            [op2 addDependency:op1];
            [op3 addDependency:op2];
            [op1 addDependency:op3];
            [_queue addOperation:op1];
            [_queue addOperation:op2];
            [[NSOperationQueue mainQueue] addOperation:op3];
    }
    

    キューNSOperationQueueに操作を追加すると、マルチスレッド実行が開始されます.
     [_queue addOperation:op1];
     [_queue addOperation:op2];
    

    UIの更新メインスレッドキューの使用
    //  [NSOpeationQueue mainQueue] addOperation ^{ 
     
    };
     [[NSOperationQueue mainQueue] addOperation:op3];
    

    操作キューのsetMaxConcurrentOperationCount:同時スレッド数を設定できます!同時最大同時スレッド数を制御する2[_queuesetMaxConcurrentOperationCount:2];ヒント:この機能はNSOperationのみ!addDependencyを使用すると、タスクの実行順序を設定し、操作キューにわたって依存関係を指定できます.
    //  , “ ” , , 
    //  
     //  : , , 。
    [op2 addDependency:op1];
    [op3 addDependency:op2];
    [op1 addDependency:op3];
     : , , 。
    

    3.3. GCD,C言語
  • GCDは「マルチコア」にマルチスレッド技術を用いるための
  • である.
  • GCDを使用するには、すべての方法がdispatchの先頭の
  • です.
  • 名詞解釈
  • globalグローバル
  • queueキュー
  • async非同期
  • sync同期
  • 非同期のタスクを実行するには、グローバルキューで実行すればよい、dispatch_async非同期実行制御は、GCDに関するキュー
  • の前後順序を制御できない
  • グローバルキューdispatch_get_global_Queueパラメータ:優先度DISPATCH_QUEUE_PRIORITY_DEFAULT、常に0 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 同期可能非同期
  • シリアルキューdispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);作成されたものであり、直接取得できないのは同期
  • のみである.
  • ホームキューdispatch_get_main_queue dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"main -> %@", [NSThread currentThread]); });同歩
  • のみ
  • 非同期と同期はメソッド名に関係なく、実行中のキューに関係します.同期は、主に方法を制御するために呼び出される順序
  • である.