iOSマルチスレッドについて

2759 ワード

NSThread####
(NSThreadオブジェクトごとに1つのスレッド、真のマルチスレッドに対応)
  • NSObjectクラスのメソッドperformSelectorInBackground:withObject:を使用してスレッドを作成します.[Object performSelectorInBackground:@selector(doSomething:) withObject:nil];
                  (  UI       ):
    [Object performSelectorOnMainThread:@selector(doSomething:) withObject:nil waitUntilDone:NO];
    
  • NSThreadを使用してマルチスレッドを実装することを選択します.NSThreadの作成には主に2つの方法がある:
    1:[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
    
    2:NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
     [myThread start];
    
              :
                      selector  ;       alloc    Thread,
           start       。   Java         。
         ,     1  NSObject    performSelectorInBackground:withObject:    ;
             start              ,          。
    
  • また、複数のスレッドが同じメソッドを実行している間にスレッドロックNSLockを使用することに注意してください.コマンド@synchronizedを使用してNSLockの使用を簡略化することができます.これにより、NSLockの作成、関連コードのロック、ロック解除を表示する必要はありません.-(void)doSomeThing:(id)anObj{ @synchronized(anObj) {//Everything between the braces is protected by the @synchronized directive. }}
    Grand Central Dispatch (GCD)####
  • The main queue:プライマリ・キュー、シリアル・キューmain queueはdispatch_を呼び出すことができます.get_main_を参照してください.main queueはプライマリ・スレッドに関連付けられているため、シリアル・キューです.dispatch_async(dispatch_get_main_queue(), ^{//something });
  • Global queues:グローバルキュー、コンカレントキュー(バックグラウンド実行)プロセスには、3つのグローバルキューが存在します.高、中(デフォルト)、低の3つの優先順位キュー(実際にはDISPATCH_QUEUE_PRIORITY_BACKGROUND)があります.dispatch_を呼び出すことができますget_global_queue関数は、キューにアクセスするために優先度を入力します.dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//something });

  • ***3つのキューは3つのスレッドではなく、より多くのスレッドがある可能性があることに注意してください.同時キューは、実際の状況に応じて合理的なスレッド数を自動的に生成することができ、dispatchキューがプログラムロジックに対して透過的なスレッドプールの管理を実現していることも理解できます.***
  • ユーザキューユーザキュー(GCDはこのキューをそう呼ばないが、このキューを表す特定の名前はないので、ユーザキューと呼ぶ)は関数dispatch_queue_createが作成したキューです.これらのキューはシリアルです.
    dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); 
    dispatch_async(queue, ^{ // something });
    //        ,    block      (FIFO)      ,         。           ,           ,         。  
    
    dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); 
    dispatch_async(queue, ^{ // something });  
    //          ,block             
    
    
      :         ,                  ,             :
    dispatch_queue_t queue1 = dispatch_queue_create("com.dispatch.writedb", DISPATCH_QUEUE_SERIAL);  
    
    - (void)writeDB:(NSData *)data  {  
        dispatch_async(queue1, ^{  
           //write database  
        });  
    }    
         writeDB:               ,  writeDB:        。