GCD:シリアル/パラレル/ホームキューの下、同期/非同期の実行方法

3711 ワード

GCDでは、さまざまなタイプのキューを取得します.
//   
dispatch_queue_t singalQueue = dispatch_queue_create("single",DISPATCH_QUEUE_SERIAL);
// 
dispatch_queue_t concrtQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
// 
dispatch_queue_t mainQueue =  dispatch_get_main_queue();
// ( )
dispatch_queue_t gobalqueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

シリアルキュー非同期実行タスク
  • 非同期は新しいスレッドを作成する能力があり、新しいスレッドを開いてタスクを実行します.
  • は、シリアル方式でタスクを実行する.
  • - (void)singalAsynQueue{
        // 
        dispatch_queue_t singalQueue =   dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
        // singalQueue ( )
        [self asynWithQueue: singalQueue];  
    }
    

    シリアルキュー同期タスクの実行
  • 同期は新しいスレッドを作成する能力がなく、新しいスレッドを開いてタスクを実行することはなく、現在の
  • にあります.
  • のプログラムのメインスレッドでタスクを実行します.タスクをシリアルで実行します.
  • - (void)singalSynQueue{
        // 
        dispatch_queue_t singalQueue =   dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
        // singalQueue ( )
        [self synWithQueue: singalQueue];
    }
    

    同時キュー非同期実行タスク(共通)
  • 非同期は新しいスレッドを作成する能力を持ち、新しいスレッドを開いてタスクを実行し、現在のプログラムのメインスレッドでタスクを実行しない.
  • は、同時にタスクを実行します.
  • - (void)concrtAsynQueue{
        // 
    //    dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
        // 
        dispatch_queue_t concrtQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        // concrtQueue ( )
        [self asynWithQueue:concrtQueue];
    }
    

    同時キュー同期タスクの実行
  • 同期は新しいスレッドを作成する能力がなく、新しいスレッドを開いてタスクを実行することはなく、現在のプログラムのメインスレッドでタスクを実行します.
  • は、同期に従ってタスクを実行する.
  • - (void)concrtSynQueue{
        // 
    //    dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
        // 
        dispatch_queue_t concrtQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        // concrtQueue ( )
        [self synWithQueue:concrtQueue];
    }
    

    プライマリ・キューの同期(プログラムのデッドロックを引き起こす)

    - (void)mainSynQueue{
        // 
        dispatch_queue_t mainQueue =  dispatch_get_main_queue();
        // mainQueue ( )
        [self synWithQueue:mainQueue];
    }
    

    プライマリ・キューの非同期(プライマリ・スレッドで順次実行)
    , (FIFO) 。
    - (void)mainAsynQueue{
        // 
        dispatch_queue_t mainQueue =  dispatch_get_main_queue();
        // mainQueue ( )
        [self asynWithQueue:mainQueue];        
    }
    

    非同期メソッドの実装

    - (void)asynWithQueue:(dispatch_queue_t)queue{
        NSLog(@"%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            NSLog(@"----1----%@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"----2----%@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"----3----%@",[NSThread currentThread]);
        });
        dispatch_async(queue, ^{
            NSLog(@"----4----%@",[NSThread currentThread]);
        });
        NSLog(@"--------end------------");
    }
    

    同期メソッドの実装

    - (void)synWithQueue:(dispatch_queue_t)queue{
        NSLog(@"%@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"----1----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"----2----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"----3----%@",[NSThread currentThread]);
        });
        dispatch_sync(queue, ^{
            NSLog(@"----4----%@",[NSThread currentThread]);
        });
        NSLog(@"--------end------------");
    }