GCD簡單使用

基礎(chǔ)使用

//使用方法,先創(chuàng)建隊(duì)列,在創(chuàng)建任務(wù)

// 串行隊(duì)列的創(chuàng)建方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
// 并發(fā)隊(duì)列的創(chuàng)建方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);

// 同步執(zhí)行任務(wù)創(chuàng)建方法
dispatch_sync(queue, ^{
    NSLog(@"%@",[NSThread currentThread]);    // 這里放任務(wù)代碼
});
// 異步執(zhí)行任務(wù)創(chuàng)建方法
dispatch_async(queue, ^{
    NSLog(@"%@",[NSThread currentThread]);    // 這里放任務(wù)代碼
});

GCD的延時(shí)執(zhí)行方法 dispatch_after

//當(dāng)我們需要延遲執(zhí)行一段代碼時(shí),就需要用到GCD的dispatch_after方法
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 2秒后異步執(zhí)行這里的代碼...
   NSLog(@"run-----");
});

GCD的一次性代碼(只執(zhí)行一次) dispatch_once

//我們在創(chuàng)建單例、或者有整個(gè)程序運(yùn)行過程中只執(zhí)行一次的代碼時(shí),我們就用到了GCD的dispatch_once方法。使用dispatch_once函數(shù)能保證某段代碼在程序運(yùn)行過程中只被執(zhí)行1次

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // 只執(zhí)行1次的代碼(這里面默認(rèn)是線程安全的)
});

柵欄操作

- (void)barrier
{
   dispatch_queue_t queue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT);

   dispatch_async(queue, ^{
       NSLog(@"----1-----%@", [NSThread currentThread]);
   });
   dispatch_async(queue, ^{
       NSLog(@"----2-----%@", [NSThread currentThread]);
   });

   dispatch_barrier_async(queue, ^{
       NSLog(@"----barrier-----%@", [NSThread currentThread]);
   });

   dispatch_async(queue, ^{
       NSLog(@"----3-----%@", [NSThread currentThread]);
   });
   dispatch_async(queue, ^{
       NSLog(@"----4-----%@", [NSThread currentThread]);
   });
}
//輸出結(jié)果(先執(zhí)行barrier前的再執(zhí)行barrier,之后再執(zhí)行barrier后的)
// --1--  
//--2--  
//barrier
//--3--
//--4--


GCD線程之間的通訊

//在線程中進(jìn)行耗時(shí)操作拿到數(shù)據(jù)后返回主線程進(jìn)行reload
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    for (int i = 0; i < 2; ++i) {
        NSLog(@"1------%@",[NSThread currentThread]);
    }

    // 回到主線程
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"2-------%@",[NSThread currentThread]);
    });
});

ios 監(jiān)視下載全部完成-GCD隊(duì)列

dispatch_group_t group = dispatch_group_create();
    for (int i=0; i<10; i++) {
        dispatch_group_enter(group);
       //dispatch_sync(dispatch_get_global_queue(0, 0), ^{
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            sleep(2);
            NSLog(@"任務(wù) %d 完成",i);
            dispatch_group_leave(group);
        });
    }
    
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任務(wù)完成");
    });

//--------------------------------------------------------------------------

dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(5);
        NSLog(@"任務(wù)一完成");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(8);
        NSLog(@"任務(wù)二完成");
        dispatch_group_leave(group);
    });
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任務(wù)完成");
    });


//如何用GCD同步若干個(gè)異步調(diào)用?

// 創(chuàng)建隊(duì)列組
dispatch_group_t group = dispatch_group_create();
// 獲取全局并發(fā)隊(duì)列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, queue, ^{ /*任務(wù)1 */ });
dispatch_group_async(group, queue, ^{ /*任務(wù)2 */ });
dispatch_group_async(group, queue, ^{ /*任務(wù)3 */ }); 
// 當(dāng)并發(fā)隊(duì)列組中的任務(wù)執(zhí)行完畢后才會執(zhí)行這里的代碼
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 合并任務(wù)結(jié)果
});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容