iOS dispatchキュー(GCD)の簡単な使用


iOSはiOS 4からlibdispatchを導入し、メッセージキューのプログラミングを実現した.
dispatchキューの生成には、次のような方法があります.
1. dispatch_queue_t queue = dispatch_queue_create("user.dispatch.mulitworker", DISPATCH_QUEUE_SERIAL); //キュー内のblockは、実際には単一スレッドで実行される先進的なリードアウト(FIFO)の順序で実行されるシリアルキューを生成します.最初のパラメータはキューの名前で、デバッグ時に非常に役立ちます.できるだけ名前を変更しないでください.
2. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //同時実行キューを生成し、blockは複数のスレッドに配布されて実行されます.
3. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //プログラム・プロセスでデフォルトで生成されるコンカレント・キューを取得し、優先度を設定して、高、中、低の3つの優先度キューを選択します.システムのデフォルトで生成されているため、dispatch_を呼び出すことはできません.resume()とdispatch_suspend()は、実行の継続または中断を制御し、シリアルキューの特性を有する.
3つのキューは3つのスレッドを表すものではなく、より多くのスレッドがある可能性があることに注意してください.コンカレントキューは、実際の状況に応じて合理的なスレッド数を自動的に生成することができ、dispatchキューがプログラムロジックに対して透過的なスレッドプールの管理を実現することも理解できる.
公式サイトのドキュメントでは、3つの同時キューがあると説明されていますが、実際にはDISPATCH_に優先度を設定するより低いキューがあります.QUEUE_PRIORITY_BACKGROUND.Xcodeデバッグでは、使用中の各dispatchキューが観察されます.
4. dispatch_queue_t queue = dispatch_get_main_queue(); //プライマリスレッドを取得するdispatchキューは、実際にはシリアルキューです.メインスレッドdispatchキューの実行の継続または中断も制御できません.
キューの使用方法
//    block,      
dispatch_async(queue, ^{
  //block    
}); 
//    block,     ,    block    。              ,         block           ,        。
dispatch_sync(queue, ^{
  //block    
});

ただし,ここでは非同期キューを構成するには2つの条件を満たさなければならないことに注意する必要がある.
  • は非同期タスクを使用し、dispatchのasyncシリーズ関数
  • を使用します.
  • キューは非同期の
  • でなければなりません.
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //      
                 NSLog(@"dispatch_async_global,%d",[[NSThread currentThread] isMainThread]);
                dispatch_async(dispatch_get_main_queue(), ^{
                    //     ,          ,   dispatch_async   dispatch_sync
                     NSLog(@"dispatch_async_main,%d",[[NSThread currentThread] isMainThread]);
                });  
            });

    コンカレントキューについて
     dispatch_group_t group = dispatch_group_create();
            dispatch_queue_t queue = dispatch_queue_create("user.group.mulitworker", DISPATCH_QUEUE_CONCURRENT); //  ,        
            
           
            dispatch_group_async(group,  queue, ^{
            
                NSLog(@"1,%d",[[NSThread currentThread] isMainThread]);
            });
            dispatch_group_async(group,  queue, ^{
                
                NSLog(@"2,%d",[[NSThread currentThread] isMainThread]);
            });
            dispatch_group_async(group,  queue, ^{
                
                NSLog(@"3,%d",[[NSThread currentThread] isMainThread]);
            });
            dispatch_notify(group, queue, ^{
                NSLog(@"finish,%d",[[NSThread currentThread] isMainThread]); //    
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"main,%d",[[NSThread currentThread] isMainThread]); //     
                });
            });

    シリアルパケットキュー
     
            dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
            dispatch_group_t group = dispatch_group_create();
            dispatch_group_async(group, queue, ^{
                [NSThread sleepForTimeInterval:1];
                NSLog(@"group1");
            });
            dispatch_group_async(group, queue, ^{
                [NSThread sleepForTimeInterval:2];
                NSLog(@"group2");
            });
            dispatch_group_async(group, queue, ^{
                [NSThread sleepForTimeInterval:3];
                NSLog(@"group3");
            });
            dispatch_group_notify(group, dispatch_get_main_queue(), ^{
                 //     
                NSLog(@"updateUi,%d",[[NSThread currentThread] isMainThread]);
            });

    について
    dispatch_notifyとdispatch_group_notifyは両方ともgroupを観察するために用いられるが,前者は非同期であり,後者は同期である
    ちえんキュー
     dispatch_queue_t queue= dispatch_get_main_queue();
                 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), queue, ^{
                         NSLog(@"   --    ------%@",[NSThread currentThread]);
             });